ScratchRobot
Jump to navigation
Jump to search
Due righe e qualche pezzo di codice da riorganizzare:
La parte arduino sta semplicemente in attesa di un comando sulla seriale e, in caso lo riconosca esegue le istruzioni associate.
/*
Python interface via usb serial
Language: Wiring/Arduino
Il programma si mette in attesa di un input sulla seriale
ed agisce a seconda dell'input ricevuto.
This example code is in the public domain.
*/
int led = 13; // first analog sensor
int inByte = 0; // incoming serial byte
void setup()
{
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
// start serial port at 9600 bps:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// establishContact(); // send a byte to establish contact until receiver responds
}
void loop()
{
// if we get a valid byte, read analog ins:
if (Serial.available() > 0) {
// get incoming byte:
inByte = Serial.read();
if ((char) inByte=='n') { // oN
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
} else if ((char) inByte=='f') { // ofF
digitalWrite(led, LOW); // turn the LED off
} else { // default:
Serial.print(inByte); // send back the unrecognized command to the sender
}
}
}
La controparte python invece si attacca ad una istanza scratch e fa da ponte/interprete dei comandi verso arduino.
import serial
import socket
import time
from array import array
import struct
import atexit
PORT = 42001
HOST = "192.168.11.40"
def decode_message(socket):
payload_size = socket.recv(4)
if not payload_size:
return ("broadcast", '"quit"')
payload_size = struct.unpack("xxxB",payload_size)[0]
msg = socket.recv(payload_size)
msgtype = msg.split(" ")[0]
args = msg.split(" ")[1:]
return (msgtype, args)
def quitting(arduino, scratch):
print " exiting... "
arduino.close()
scratch.close()
def manage_broadcast(payload, serialConnection):
payload = payload[1:-1]
if payload=="go":
serialConnection.write('n')
if payload=="stop":
serialConnection.write('f')
if payload=="quit":
serialConnection.write('f')
for i in range(3):
serialConnection.write('n')
time.sleep(0.1)
serialConnection.write('f')
time.sleep(0.1)
quit()
def manage_sensor_update(sensor, value, serialConnection):
# Modificando/creando una variabile globale viene inviato un messaggio di
# tipo sensor-update con il nome della variabile ed il suo valore attuale
sensor = sensor[1:-1]
if payload=="go":
serialConnection.write('n')
if payload=="stop":
serialConnection.write('f')
if payload=="quit":
serialConnection.write('f')
for i in range(3):
serialConnection.write('n')
time.sleep(0.1)
serialConnection.write('f')
time.sleep(0.1)
quit()
def arduino_connect(**kwargs):
ports = ["/dev/ttyUSB0", "/dev/ttyACM0"]
for i in ports:
try:
print ("Arduino Connect: trying %i", i)
return serial.Serial(i, baudrate=9600, timeout=1)
except:
pass
print "Arduino not found. Abort."
quit()
arduino=arduino_connect(baudrate=9600, timeout=1)
print ("Arduino Found.")
scratch = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
scratch.connect((HOST, PORT))
print ("Scratch Found.")
except:
print "Scratch not found. Abort."
arduino.close()
quit()
atexit.register(quitting, arduino, scratch)
print "Waiting for messages..."
while 1:
time.sleep(0.01)
type, args = decode_message(scratch)
if type == "broadcast":
manage_broadcast(*args, serialConnection=arduino)
if type == "sensor-update":
manage_sensor_update(*args, serialConnection=arduino)
'Nota: ' Se arduino è collegato via usb alla macchina host quando Scratch va in modalità server
scratch sembra inviare direttamente i comandi anche a lui (penso che in realta cerchi un handshake
senza successo) e python non riesce più ad interfacciardi ad arduino.