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.

#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
#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
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