-2

If I make a loop on my Raspberry Pi from 1 to 10 and assigned to a variable x for a small example, how do I take it and transfer it to an Arduino via Serial to be able to be used for an angle for my stepper motor or to simply make it usable as a variable in a loop?

Is there a small code from a Pi and Arduino each that can help me? I know this is like an easy thing, but I'm trying to find a reference because I'm expanding upon this, using Node Red, Stepper Motors, Water Valves, and a ton of other things.

ceilowens
  • 1
  • 2

1 Answers1

0

Are you talking about general serial communication? I have something that will work on both ends. It is not simple

Here is what you should run on the Pi.

Change Baud rate to proper rate for your device Change "Possible_Parameters" to a list of possible angles to run

import time
import serial
import numpy as np
import serial.tools.list_ports
from serial.tools.list_ports import comports
import sys
import glob
import serial

def serial_ports():
    """ Lists serial port names
    :raises EnvironmentError:
        On unsupported or unknown platforms
    :returns:
        A list of the serial ports available on the system
    """
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or 
        sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []

for port in ports:
    try:
        s = serial.Serial(port)
        s.close()
        result.append(port)
    except (OSError, serial.SerialException):
        pass
return result

for i in range(len(serial_ports())):
    print(i, serial_ports()[i])

if len(serial_ports()) > 0:
    Port_Selected = int(input("Select Port like 0: "))
    Port = serial_ports()[Port_Selected]
    Baud = 9600
    X=1
else:
    print("No ports detected")
    X=0
    pass

if X==1:
    with serial.Serial(Port, Baud, timeout=.1) as Qtpy:
        if Qtpy.isOpen():
            print('{} connected'.format(Qtpy.port))
            try:
                while True:
                    if X==1:
                        Possible_Parameters=["List", "Keys", "Here"]
                        
                        for i in range(len(Possible_Parameters)):
                            print(i, Possible_Parameters[i])
                        Possible_Parameter_Choice = int(input("Choose Parameter to change :"))
                        Msg1 = Possible_Parameters[Possible_Parameter_Choice] 
                        Msg_1=Msg1 + '\n' #add ending parameter for C++ serial communication
                        Msg2 = (input("Input a new value for parameter: "))
                        Msg_2=Msg2 + '\n'
                        #print (Msg_B)
                        Qtpy.write(Msg_1.encode())
                        Qtpy.write(Msg_2.encode())
                        X=0
                    while Qtpy.inWaiting() == 0:
                        pass
                    if Qtpy.inWaiting() > 0:
                        Msg_Back = Qtpy.readline()
                        print (Msg_Back)
                        #Qtpy.flushInput()
                    #X = input("Set X to 1")     
                    #time.sleep(0.02)
                except KeyboardInterrupt:
                    print('Keyboard interrupted')

Here is something for your arduino. Notice that I am using pairs. I do this to make one a key for the value. The first item received identifies where the value will go. Note: I did cannibalize my code for the arduino part so you will need to double check it for errors

// Prep Serial Communication Variables - 7 variables
const uint8_t Max_Length = 32;
const uint8_t Max_Value_Length = 16;
char MSG_In[Max_Length]; //Parameter name (Send in pairs with value
char MSG_In_Value[Max_Value_Length]; //Parameter value
char MSG_Out[Max_Length];
char Bits_N_Pieces; // bytes recieved
bool Incoming; // Gets set to 1 when serial communication is recieved

char Key[] = Your_Keyword;

// Convert you angles to integers before sending
int Value;    
// Or use this and change atoi in later statement
// Library to convert float to char
/* #include <avr/dtostrf.h>
float Value; */    

void setup() {
Serial.begin(9600);
}

void loop() {

  // Serial Communication
  while (Serial.available() > 0) {
    Incoming=1;
    static unsigned int MSG_Position = 0;
    // read the incoming byte:
    Bits_N_Pieces = Serial.read();
    //Serial.println(Bits_N_Pieces);
    if (Bits_N_Pieces != '\n'  && MSG_Position < Max_Length -1) {
      MSG_In[MSG_Position] = Bits_N_Pieces;
      // Serial.println(MSG_In);
      MSG_Position++;
    } else {
      MSG_In[MSG_Position] = '\0';
      MSG_Position = 0;
      break;
    }
  }
  if (Incoming==1) {
    Incoming=0;
    while (Serial.available() > 0) {
      // Serial.println("Reading Value");
      static unsigned int MSG_Position = 0;
      Bits_N_Pieces = Serial.read();
      if(Bits_N_Pieces != '\n'  && MSG_Position < Max_Value_Length -1) {
        MSG_In_Value[MSG_Position] = Bits_N_Pieces;
        //Serial.println(MSG_In_Value);
        MSG_Position++;
      } else {
        MSG_In_Value[MSG_Position] = '\0';
        MSG_Position =0;
        break;
      }
    }

    if (strcmp(MSG_In, Key) == 0) {
      Value = atoi(MSG_In_Value);
      /* Value = atof(MSG_In_Value);*/ 
    }
    
    //Zero out MSG_XXX to prep for next communication
    bzero(MSG_In, Max_Length);
    bzero(MSG_In_Value, Max_Value_Length); 
  
  }
  delay(1000);
}
Nimantha
  • 6,405
  • 6
  • 28
  • 69
WhiskE
  • 1
  • 2