Salve a tutti, sto facendo un piccolo esercizio nel far comunicare il mio Raspberry pi 3B+ con un Arduino Uno collegati tramite cavo usb.
Questo è il codice del raspberry
#!/usr/bin/env python
import RPi.GPIO as GPIO
import serial
import time
BtnPin = 12
Led_status = 0
arduinoSerialData = serial.Serial('/dev/ttyACM0',9600)
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def loop():
GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=swLed, bouncetime=200)
while True:
time.sleep(1)
def swLed(ev=None):
global Led_status
Led_status = not Led_status
if Led_status == 1:
print 'led on'
arduinoSerialData.write("01|led_acceso")
else:
print 'led off'
arduinoSerialData.write("01|led_spento")
def destroy():
arduinoSerialData.write("01|led_spento")
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt:
destroy()
Questo è il codice di arduino
const int led = 13;
String data;
String stringa;
/******************************
* formato data --> "01|STRINGA"
******************************/
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
while (Serial.available() > 0) {
data = Serial.readString();
data = data.substring(0, data.length()-2);
Serial.println("Stringa che ho letto: "+data+" | lunghezza: "+data.length());
if(data.substring(0,3).equals("01|")){
stringa = data.substring(3);
}
}
if(stringa.equals("led_acceso")){
digitalWrite(led,HIGH);
}
if(stringa.equals("led_spento")){
digitalWrite(led,LOW);
}
}
In sostanza io premo un pulsante collegato al raspberry e lui tramite seriale dice all'arduino di accendere o spegnere un led.
Per controllare il messaggio seriale che arriva ad arduino ho creato un altro programmino per raspberry che lo eseguo su un'altra shell, qui di seguito il codice
#!/usr/bin/env python
import serial
db = 9600
arduinoSerialData = serial.Serial('/dev/ttyACM0',db)
print "db =",db
def loop():
while True:
if(arduinoSerialData.inWaiting()>0):
myData = arduinoSerialData.readline()
print myData
if __name__ == '__main__':
loop()
Grazie a questo programmino ho scoperto che ad arduino legge dalla seriale 01|led_acce oppure 01|led_spen
Come mai il messaggio non arriva tutto?
PS. Ho fatto prove a scrivere un messaggio più breve, tipo "acceso" e "spento" ma ad arduino arriva "acce" o "spen"
Alessio