ScratchRobot

Da raspibo.
Versione del 25 lug 2013 alle 17:06 di Eineki (discussione | contributi) (Aggiunto script python)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.