Contrôleur basé sur le chip DC L298N
Proposé par Velleman sous la référence WPI409
 
Velleman VMA330
 
Par exemple, la Loco Vossloh G1700BB /AM 843 - HOBBYTRAIN H2948
dans sa version "Chemins de Fer belges" ...
... parce qu'elle existe dans la réalité
 
M5Stack Kit Atom
 
 
 
 
import time
import RPi.GPIO as GPIO
import serial
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# Détecteur d'obstacle - Velleman VMA330
# Bien qu'un seul détecteur suffise en théorie (puisque le VMA330 comporte un émetteur I.R.
# et un récepteur qui détecte la lumière réfléchie par l'obstacle), deux détecteurs sont
# utilisés ici : l'un pour émettre le faisceau I.R., l'autre pour le détecter.
# Deux raisons à cela
# - éliminer les problèmes de détection liés à un objet trop sombre (p.ex. un wagon brun foncé ...)
# - affiner la zone de détection (p.ex. un espace entre deux wagons)
GPIO.setup(14, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(15, GPIO.IN, pull_up_down = GPIO.PUD_UP)
# La détection en 15 ne sera pas utilisée ...
# Module contrôleur moteur DC L298N - Velleman WPI409
# controlé par les pins 21, 20 et 16 du Raspberry
M1_En = 21
M1_In1 = 20
M1_In2 = 16
GPIO.setup(M1_En, GPIO.OUT)
GPIO.setup(M1_In1, GPIO.OUT)
GPIO.setup(M1_In2, GPIO.OUT)
GPIO.output(M1_In1, GPIO.LOW) # moteur a l'arret
GPIO.output(M1_In2, GPIO.LOW) # pour commencer ...
M1_Vitesse = GPIO.PWM(M1_En, 100) # découpage du signal pour réguler la vitesse
def arret():
GPIO.output(M1_In1, GPIO.LOW)
GPIO.output(M1_In2, GPIO.LOW)
def arriere():
M1_Vitesse.start(0)
GPIO.output(M1_In1, GPIO.HIGH)
GPIO.output(M1_In2, GPIO.LOW)
def avant():
M1_Vitesse.start(0)
GPIO.output(M1_In1, GPIO.LOW)
GPIO.output(M1_In2, GPIO.HIGH)
M1_Vitesse.start(0)
def manoeuvre():
M1_Vitesse.start(25)
#
# Lecteur de code-barre M5Stack + Kit Atom
# N.B. se programme "comme un Arduino" mais sans nécessiter un Arduino ...
# https://docs.m5stack.com/en/atom/atomic_qr
#
bar_code = serial.Serial("/dev/ttyUSB0", 9600, timeout=1)
time.sleep(0.1) # wait for serial to open
# table de relation entre un code-barre unique et une lettre (qui pourrait être répétée).
# Ne pas utiliser autre chose que des identifiants uniques comme codes-barres car
# cela permet d'éviter des problèmes d'interprétation si un même code est lu plusieurs fois
# (si un wagon passe lentement devant le lecteur, son code-barre est parfois lu plusieurs fois)
d = { '101':'H' ,
'102':'E' ,
'103':'L' ,
'104':'L' ,
'105':'O' ,
'106':' ' ,
'107':'W' ,
'108':'O' ,
'109':'R' ,
'110':'L' ,
'111':'D' ,
'112':'!'
}
answer = 0
liste = list()
read_ok = False
end = False
arret()
print('<ENTER> pour commencer')
input()
avant()
manoeuvre()
while not end: # attente wagon
ok = False
while not ok:
if GPIO.input (14) == 1:
ok = True
arret()
time.sleep(0.1)
read_ok = False
while read_ok is False: # attente code-barre
if bar_code.isOpen():
if bar_code.inWaiting()>0:
answer=bar_code.readline().decode(encoding='UTF-8',errors='strict')
for c in answer.split('\r'): # supprimer code "Carriage Return"
if c not in liste and c!= '': # ne garder que les nouveaux codes, c-à-d
liste.append(c) # ignorer un même code qui serait lu
# print (liste) # plusieurs fois
bar_code.flushInput() # remove data after reading
read_ok = True
avant() # quand le code a été lu, redémarrer
manoeuvre()
ok = False # détecter le passage au wagon suivant
w = 0 # par détection de l'interstice entre deux wagons
while not ok:
if GPIO.input (14) == 0:
ok = True
w = w + 1
if w > 15: # interstice trop grand <=> tout le train est passé => stop
ok = True # sortir de la boucle attente interstice
end = True # sortir de la boucle principale
time.sleep(0.1)
print ('terminé')
arret()
time.sleep(1)
arriere()
manoeuvre()
time.sleep(3.5)
arret()
print ('----------- ordre -----------')
for i in liste:
print (' ', d[i])
print()
print ('ENTER = FIN PROGR')
input()
print ('fin progr')
Le lecteur de code-barres M5Stack se programme comme un microcontrôleur Arduino
/*Press button to scan, serial monitor will print information*/
#include <M5Atom.h>
#define TRIG 23
#define DLED 33
void setup() {
M5.begin(false, false, true);
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, 22, 19);
M5.dis.drawpix(0, 0x00f000);
pinMode(TRIG, OUTPUT);
pinMode(DLED, INPUT);
digitalWrite(TRIG, HIGH);
}
void loop() {
M5.update();
if(digitalRead(39) == LOW){
digitalWrite(TRIG, LOW);
}else {
digitalWrite(TRIG, HIGH);
}
if(digitalRead(DLED) == HIGH){
while(Serial2.available() > 0){
char ch = Serial2.read();
Serial.print(ch);
}
}
}