Controler des Arduino depuis un Raspberry PI par liaison série


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi


L’objectif est de tester comment controler deux cartes (ou plus) arduino depuis un raspberry pi 3 par une liaison série.

Montage

2-arduino-1-raspberry-pi_bb.jpg

Code Arduino

#define LED_GREEN 1
#define LED_RED 2
#define LED_BLUE 3

int ledGreen = 7;
int ledRed = 6;
int ledBlue = 5;

int lightLed = 0 ;

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

        pinMode(ledGreen, OUTPUT);
        pinMode(ledRed, OUTPUT);
        pinMode(ledBlue, OUTPUT);

        digitalWrite(ledGreen, LOW);
        digitalWrite(ledRed, LOW);
        digitalWrite(ledBlue, LOW);
}


void loop() {
        if ( Serial.available() ) {
                lightLed = Serial.read() - '0' ;
                if ( lightLed == LED_GREEN ) {
                        digitalWrite(ledGreen, HIGH);
                        digitalWrite(ledRed, LOW);
                        digitalWrite(ledBlue, LOW);

                } else if ( lightLed == LED_RED ) {
                        digitalWrite(ledGreen, LOW);
                        digitalWrite(ledRed, HIGH);
                        digitalWrite(ledBlue, LOW);

                } else if ( lightLed == LED_BLUE ) {
                        digitalWrite(ledGreen, LOW);
                        digitalWrite(ledRed, LOW);
                        digitalWrite(ledBlue, HIGH);

                } else {
                        // invalid input turn off all leds
                        digitalWrite(ledGreen, LOW);
                        digitalWrite(ledRed, LOW);
                        digitalWrite(ledBlue, LOW);
                }
        }
}

Installer le binaire sur les deux arduino, attention de bien relier les leds sur les pins 7 6 5 de l’arduino.

BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyACM0
ARDUINO_LIBS = 
ARDUINO_DIR = /usr/share/arduino
include /usr/share/arduino/Arduino.mk
$> make
$> make upload

Code Raspberry PI

#include <stdio.h>
#include <string.h>
#include <unistd.h> 
#include <fcntl.h> 
#include <termios.h> 

#include <errno.h>

#define ARDUINO_1_TTY   "/dev/ttyACM0"
#define ARDUINO_2_TTY   "/dev/ttyACM1"

void setOptionsUARTS(int fd) {
    struct termios options;
    tcgetattr(fd, &options);
    options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;     //<Set baud rate
    options.c_iflag = IGNPAR;
    options.c_oflag = 0;
    options.c_lflag = 0;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &options);
}

int main(void) {
    int arduino1FD = open(ARDUINO_1_TTY, O_RDWR | O_NOCTTY ); 
    if (arduino1FD == -1) {
        printf ("Error no is : %d\n", errno);
        printf("Error description is : %s\n",strerror(errno));
        return(-1);
    }

    int arduino2FD = open(ARDUINO_2_TTY, O_RDWR | O_NOCTTY ); 
    if (arduino2FD == -1) {
        close( arduino1FD );
        printf ("Error no is : %d\n", errno);
        printf("Error description is : %s\n",strerror(errno));
        return(-1);
    }

    setOptionsUARTS( arduino1FD ) ;
    setOptionsUARTS( arduino2FD ) ;

    char readBuf[3] = {0};
    char buf[] = "q";
    int fd = -1 ;
    char* sendTo = "" ;
    char c = '\0';
    while ( c != 'q' ) {
        printf("q : quit\n");
        printf("arduino 1:\n");
        printf("    1 : led verte\n");
        printf("    2 : led rouge\n");
        printf("    3 : led bleue\n");
        printf("arduino 2:\n");
        printf("    8 : led verte\n");
        printf("    9 : led rouge\n");
        printf("    0 : led bleue\n");
        fgets(readBuf, sizeof(readBuf), stdin);
        c = readBuf[0];
        if ( c == '1' ) {
            buf[0] = '1' ;
            fd = arduino1FD ;
            sendTo = ARDUINO_1_TTY ;

        } else if ( c == '2' ) {
            buf[0] = '2' ;
            fd = arduino1FD ;
            sendTo = ARDUINO_1_TTY ;

        } else if ( c == '3' ) {
            buf[0] = '3' ;
            fd = arduino1FD ;
            sendTo = ARDUINO_1_TTY ;

        } else if ( c == '8' ) {
            buf[0] = '1' ;
            fd = arduino2FD ;
            sendTo = ARDUINO_2_TTY ;

        } else if ( c == '9' ) {
            buf[0] = '2' ;
            fd = arduino2FD ;
            sendTo = ARDUINO_2_TTY ;

        } else if ( c == '0' ) {
            buf[0] = '3' ;
            fd = arduino2FD ;
            sendTo = ARDUINO_2_TTY ;

        } else {
            fd = -1;
        }
        if ( fd != -1 ) {
            size_t nbWrite = write(fd, buf, 1);
            printf("send %d bytes '%c' to %s\n",nbWrite, buf[0], sendTo);
        } else {
            printf("invalid input\n");
        }

    }

    close( arduino2FD );
    close( arduino1FD );
}
$> gcc -o send-cmd send-cmd.c

Tests

Installer le code arduino sur les deux cartes. Connecter les deux cartes arduino par cable USB sur le raspberry pi, vérifier que la premiere carte prend bien /dev/ttyACM0 et la seconde /dev/ttyACM1, sinon adapter le code en conséquence. Compiler et lancer le send-cmd.c sur le raspberry-pi.

1 va allumer la led verte sur le premier arduino. 2 va allumer la led rouge sur le premier arduino. 3 va allumer la led bleue sur le premier arduino.

8 va allumer la led verte sur le second arduino. 9 va allumer la led rouge sur le second arduino. 0 va allumer la led bleue sur le second arduino.

q permet de quitter.


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi