1

I'm trying to send 3 ints in the range of 0-180 from Python to the Arduino Uno device using pySerial (py3K). I have managed to send 1 int by using python's struct lib (not sure if it's the best or fastest way but it works).

However I'm failing to send more than 1 and every example online seems to stop at 1.

Here's the simplified code. The task is to send servo0-servo4 to the Arduino and apply those values to the corresponding servos.

Python Code

import serial import struct import time bge.arduino = serial.Serial('/dev/ttyACM0', 9600) # let it initialize time.sleep(2) # send the first int in binary format bge.arduino.write(struct.pack('>B', 45)) 

Arduino code

#include <Servo.h> Servo servo0; Servo servo1; Servo servo2; void setup(){ Serial.begin(9600); servo0.attach(3); servo1.attach(5); servo2.attach(6); } void loop(){ if(Serial.available()){ int message = Serial.read(); // control the servo servo0.write(message); } } 

2 Answers 2

2

I guess I'll answer my own question for anyone else having this issue. What I did was:

Python:

# write to arduino as raw binary bge.arduino.write(struct.pack('>BBB',45,90,180)) 

Arduino:

#include <Servo.h> Servo servo0; Servo servo1; Servo servo2; // create array int incoming[2]; void setup(){ Serial.begin(9600); servo0.attach(3); servo1.attach(5); servo2.attach(6); } void loop(){ while(Serial.available() >= 3){ // fill array for (int i = 0; i < 3; i++){ incoming[i] = Serial.read(); } // use the values servo0.write(incoming[0]); servo1.write(incoming[1]); servo2.write(incoming[2]); } } 
1
  • You're not verifying if Serial.available() has 3 values available. So it's going to get filled with -1's if there aren't. Check to see how many bytes are in the receive buffer. Commented Mar 27, 2015 at 23:28
0
void loop(){ if(Serial.available() >= 3){ // fill array for (int i = 0; i < 3; i++){ incoming[i] = Serial.read(); } // use the values servo0.write(incoming[0]); servo1.write(incoming[1]); servo2.write(incoming[2]); } } 
2
  • Thank you @baldengineer. I'm now verifying like you proposed. However after a little while of playing with the program it completely messes up and I have to reboot the Arduino for it to work again. I suspect the ordering of the bytes might be shuffling? Commented Mar 29, 2015 at 0:15
  • Holly cow, I think I solved the problem by replacing if(Serial.available().. with while(Serial.available().. Does that make sense to you? Commented Mar 30, 2015 at 3:21

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.