Add files via upload
This commit is contained in:
@@ -0,0 +1,426 @@
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
OSC to I2C CORBACS Show pour les amis nos morts v0.1a 06/2022 06/2022
|
||||
https://www.facebook.com/LesAmisNosMorts/
|
||||
https://lesamisnosmorts.fr/
|
||||
https://www.youtube.com/watch?v=2guq3Z296mI&list=PLyRucERHaznPcJ69G39vllQ96x3izfdkT
|
||||
|
||||
Conception artistique : Guillaume dalin
|
||||
lesamisnosmorts@gmail.com / +33676745128
|
||||
|
||||
Code par Clément SAILLANT / EcObsolent
|
||||
c.saillant@gmail.com / +33625334420
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "config.h" // fichier de Définition des valeur de servo
|
||||
|
||||
#define DEBUG 0 // 1 pour activer le debug serie
|
||||
|
||||
// ethernet et OSC
|
||||
#include <SPI.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
|
||||
#include <ENC28J60lwIP.h>
|
||||
#include <EthernetUdp.h>
|
||||
//#include <WiFiUdp.h>
|
||||
#define CSPIN 15
|
||||
|
||||
|
||||
//WiFiUDP Udp;
|
||||
EthernetUDP Udp;
|
||||
|
||||
//Wiznet5500lwIP eth(CSPIN);
|
||||
//Wiznet5100lwIP eth(CSPIN);
|
||||
ENC28J60lwIP eth(CSPIN);
|
||||
|
||||
// A UDP instance to let us send and receive packets over UDP
|
||||
byte mac[] = {
|
||||
0xDE, 0xAD, 0xBE, 0xE3, 0xFE, 0xED
|
||||
};
|
||||
|
||||
unsigned int localPort = 10000;
|
||||
|
||||
|
||||
|
||||
|
||||
// OSC--------------------------
|
||||
//port numbers
|
||||
#include <OSCBundle.h>
|
||||
#include <OSCBoards.h>
|
||||
#include <OSCMessage.h>
|
||||
|
||||
OSCErrorCode error;
|
||||
unsigned int ledState = LOW; // LOW means led is *on*
|
||||
|
||||
#ifndef BUILTIN_LED
|
||||
#ifdef LED_BUILTIN
|
||||
#define BUILTIN_LED LED_BUILTIN
|
||||
#else
|
||||
#define BUILTIN_LED 13
|
||||
#endif
|
||||
#endif
|
||||
//----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// valeur min et max OSC pour mappage des valeurs vers angle SERVO
|
||||
#define min_value 0
|
||||
#define max_value 1000
|
||||
|
||||
|
||||
|
||||
// I2C et carte PWM(servo)
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
// Depending on your servo make, the pulse width min and max may vary, you
|
||||
// want these to be as small/large as possible without hitting the hard stop
|
||||
// for max range. You'll have to tweak them as necessary to match the servos you
|
||||
// have!
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
|
||||
//Driver :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
|
||||
//Servos :
|
||||
#define nb_servo 49 // Nombre de servo controlés
|
||||
|
||||
int servo_select = 0; // variable de selection servo
|
||||
int osc_value[nb_servo]; // pour stockage valeur par servo
|
||||
int osc_value_old[nb_servo]; // pour comparaison si changement de valeur
|
||||
int pulse = 0;
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}; // défini sur quelle voie du driver sera branché chaque servomoteurs
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48
|
||||
};
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
pinMode(BUILTIN_LED, OUTPUT);
|
||||
digitalWrite(BUILTIN_LED, ledState); // turn *on* led
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println();
|
||||
// Serial.print(ESP.getFullVersion());
|
||||
Serial.println();
|
||||
SPI.begin();
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.setFrequency(4000000);
|
||||
|
||||
eth.setDefault(); // use ethernet for default route
|
||||
|
||||
IPAddress ip(192, 168, 2, 115);
|
||||
IPAddress gw(192, 168, 1, 1);
|
||||
IPAddress nm(255, 255, 255, 0);
|
||||
eth.config(ip, gw, nm, gw);
|
||||
|
||||
int present = eth.begin(mac);
|
||||
if (!eth.begin()) {
|
||||
Serial.println("no ethernet hardware present");
|
||||
while (1);
|
||||
}
|
||||
|
||||
Serial.print("connecting ethernet");
|
||||
while (!eth.connected()) {
|
||||
Serial.print(".");
|
||||
delay(1000);
|
||||
}
|
||||
Serial.println();
|
||||
Serial.print("ethernet ip address: ");
|
||||
Serial.println(eth.localIP());
|
||||
Serial.print("ethernet subnetMask: ");
|
||||
Serial.println(eth.subnetMask());
|
||||
Serial.print("ethernet gateway: ");
|
||||
Serial.println(eth.gatewayIP());
|
||||
|
||||
|
||||
|
||||
Serial.println("Starting UDP");
|
||||
Udp.begin(localPort);
|
||||
Serial.print("Local port: ");
|
||||
|
||||
Serial.println(localPort);
|
||||
|
||||
//Serial.println(Udp.localPort());
|
||||
|
||||
|
||||
// Déifinition des cartes de I2C/PWM
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
// centrage des servo
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
//Debug Mode enable in case DEBUG equal 1
|
||||
//Serial.begin(115200);
|
||||
delay(100);
|
||||
Serial.println("CORBAC I2C START");
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
||||
void led(OSCMessage &msg) {
|
||||
ledState = msg.getInt(0);
|
||||
digitalWrite(BUILTIN_LED, ledState);
|
||||
Serial.print("/led: ");
|
||||
Serial.println(ledState);
|
||||
}
|
||||
|
||||
void loop() { // Main loop
|
||||
OSCMessage msgIN;
|
||||
int size;
|
||||
|
||||
if ( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while (size--)
|
||||
msgIN.fill(Udp.read());
|
||||
|
||||
if (!msgIN.hasError()) {
|
||||
|
||||
msgIN.route("/gd1", gd1);
|
||||
msgIN.route("/gd2", gd2);
|
||||
msgIN.route("/gd3", gd3);
|
||||
msgIN.route("/gd4", gd4);
|
||||
msgIN.route("/gd5", gd5);
|
||||
msgIN.route("/gd6", gd6);
|
||||
msgIN.route("/gd7", gd7);
|
||||
msgIN.route("/gd8", gd8);
|
||||
|
||||
msgIN.route("/c1", c1);
|
||||
msgIN.route("/c2", c2);
|
||||
msgIN.route("/c3", c3);
|
||||
msgIN.route("/c4", c4);
|
||||
msgIN.route("/c5", c5);
|
||||
msgIN.route("/c6", c6);
|
||||
msgIN.route("/c7", c7);
|
||||
msgIN.route("/c8", c8);
|
||||
msgIN.route("/c9", c9);
|
||||
msgIN.route("/c10", c10);
|
||||
msgIN.route("/c11", c11);
|
||||
msgIN.route("/c12", c12);
|
||||
msgIN.route("/c13", c13);
|
||||
msgIN.route("/c14", c14);
|
||||
msgIN.route("/c15", c15);
|
||||
msgIN.route("/c16", c16);
|
||||
|
||||
msgIN.route("/sheep", sheep);
|
||||
msgIN.route("/badger", badger);
|
||||
msgIN.route("/cow1", cow1);
|
||||
msgIN.route("/cow2", cow2);
|
||||
|
||||
//Serial.println("OSC alive! ");
|
||||
}
|
||||
|
||||
}
|
||||
// mise à jour des valeur de servo
|
||||
|
||||
for (int servo_select = 0; servo_select < nb_servo ; servo_select++) {
|
||||
if (osc_value_old[servo_select] != osc_value[servo_select])
|
||||
{
|
||||
#ifdef DEBUG
|
||||
//Serial.println("mise à jour position moteur");
|
||||
#endif
|
||||
|
||||
osc_value_old[servo_select] = osc_value[servo_select];
|
||||
int servo_value = map(osc_value[servo_select], min_value, max_value, -90, 90);
|
||||
pulse = map(servo_value, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 1");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 2");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 3");
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
//Serial.print("moteur : ");
|
||||
//Serial.println(servo_select);
|
||||
//Serial.print("valeur osc : ");
|
||||
//Serial.println(osc_value[servo_select]);
|
||||
//Serial.print("valeur pulse : ");
|
||||
//Serial.println(pulse);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Fonction reception adresse osc;
|
||||
//definir numero de servo servo_select = 0;
|
||||
|
||||
void gd1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 0;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 1;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 10;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 11;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 16;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 17;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 26;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 27;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void c1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 4;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 5;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 6;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 7;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 12;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 13;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 14;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 15;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c9(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 20;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c10(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 21;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c11(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 22;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c12(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 23;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c13(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 28;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c14(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 29;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c15(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 30;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c16(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 31;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
void sheep(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 32;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void badger(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 33;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 34;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 35;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// Définition valeur servo, utilisé le fichier excel pour modifier les valeur :
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MIN0 230
|
||||
#define MAX0 530
|
||||
#define BOOT0 0
|
||||
#define MIN1 230
|
||||
#define MAX1 530
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 120
|
||||
#define MAX4 350
|
||||
#define BOOT4 -90
|
||||
#define MIN5 145
|
||||
#define MAX5 330
|
||||
#define BOOT5 -90
|
||||
#define MIN6 125
|
||||
#define MAX6 300
|
||||
#define BOOT6 -90
|
||||
#define MIN7 115
|
||||
#define MAX7 300
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 210
|
||||
#define MAX10 530
|
||||
#define BOOT10 0
|
||||
#define MIN11 220
|
||||
#define MAX11 520
|
||||
#define BOOT11 0
|
||||
#define MIN12 120
|
||||
#define MAX12 300
|
||||
#define BOOT12 -90
|
||||
#define MIN13 120
|
||||
#define MAX13 320
|
||||
#define BOOT13 -90
|
||||
#define MIN14 120
|
||||
#define MAX14 320
|
||||
#define BOOT14 -90
|
||||
#define MIN15 120
|
||||
#define MAX15 320
|
||||
#define BOOT15 -90
|
||||
#define MIN16 220
|
||||
#define MAX16 510
|
||||
#define BOOT16 0
|
||||
#define MIN17 180
|
||||
#define MAX17 510
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 100
|
||||
#define MAX20 260
|
||||
#define BOOT20 -90
|
||||
#define MIN21 100
|
||||
#define MAX21 290
|
||||
#define BOOT21 -90
|
||||
#define MIN22 100
|
||||
#define MAX22 300
|
||||
#define BOOT22 -90
|
||||
#define MIN23 100
|
||||
#define MAX23 250
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 220
|
||||
#define MAX26 510
|
||||
#define BOOT26 0
|
||||
#define MIN27 210
|
||||
#define MAX27 510
|
||||
#define BOOT27 0
|
||||
#define MIN28 100
|
||||
#define MAX28 240
|
||||
#define BOOT28 -90
|
||||
#define MIN29 100
|
||||
#define MAX29 300
|
||||
#define BOOT29 -90
|
||||
#define MIN30 110
|
||||
#define MAX30 270
|
||||
#define BOOT30 -90
|
||||
#define MIN31 100
|
||||
#define MAX31 250
|
||||
#define BOOT31 -90
|
||||
#define MIN32 100
|
||||
#define MAX32 170
|
||||
#define BOOT32 -90
|
||||
#define MIN33 100
|
||||
#define MAX33 160
|
||||
#define BOOT33 -90
|
||||
#define MIN34 100
|
||||
#define MAX34 190
|
||||
#define BOOT34 0
|
||||
#define MIN35 100
|
||||
#define MAX35 440
|
||||
#define BOOT35 -90
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
@@ -0,0 +1,395 @@
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
OSC to I2C CORBACS Show pour les amis nos morts v0.1a 06/2022 06/2022
|
||||
https://www.facebook.com/LesAmisNosMorts/
|
||||
https://lesamisnosmorts.fr/
|
||||
https://www.youtube.com/watch?v=2guq3Z296mI&list=PLyRucERHaznPcJ69G39vllQ96x3izfdkT
|
||||
|
||||
Conception artistique : Guillaume dalin
|
||||
lesamisnosmorts@gmail.com / +33676745128
|
||||
|
||||
Code par Clément SAILLANT / EcObsolent
|
||||
c.saillant@gmail.com / +33625334420
|
||||
|
||||
|
||||
librairie :
|
||||
https://github.com/wemos/WEMOS_Motor_Shield_Arduino_Library
|
||||
https://github.com/UIPEthernet/UIPEthernet
|
||||
https://github.com/CNMAT/OSC
|
||||
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "config.h" // fichier de Définition des valeur de servo
|
||||
#include "defines.h" // config ethernet
|
||||
// Ethernet
|
||||
#include <SPI.h>
|
||||
#include <Ethernet.h>
|
||||
#include <EthernetUdp.h>
|
||||
|
||||
#define ASYNC_UDP_ETHERNET_VERSION_MIN_TARGET "AsyncUDP_Ethernet v1.2.1"
|
||||
#define ASYNC_UDP_ETHERNET_VERSION_MIN 1002001
|
||||
|
||||
#include <Ticker.h>
|
||||
|
||||
// 600s = 10 minutes to not flooding, 60s in testing
|
||||
#define UDP_REQUEST_INTERVAL 60
|
||||
|
||||
#define UDP_REMOTE_PORT 10000
|
||||
|
||||
AsyncUDP udp;
|
||||
|
||||
// OSC instance to let us send and receive OSC packet
|
||||
// const unsigned int localPort = 10000; //port numbers
|
||||
#include <OSCBundle.h>
|
||||
#include <OSCBoards.h>
|
||||
#include <OSCMessage.h>
|
||||
OSCErrorCode error;
|
||||
|
||||
// I2C et carte PWM(servo)
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
|
||||
//Driver servo pwm :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
//Servos :
|
||||
#define nb_servo 61 // Nombre de servo controlés + 1
|
||||
int servo_select = 0; // variable de selection servo
|
||||
//Liste des adresse moteur
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60};
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48, MIN49, MIN50, MIN51, MIN52, MIN53, MIN54, MIN55, MIN56, MIN57, MIN58, MIN59, MIN60
|
||||
};
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48, MAX49, MAX50, MAX51, MAX52, MAX53, MAX54, MAX55, MAX56, MAX57, MAX58, MAX59, MAX60
|
||||
};
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48, BOOT49, BOOT50, BOOT51, BOOT52, BOOT53, BOOT54, BOOT55, BOOT56, BOOT57, BOOT58, BOOT59, BOOT560
|
||||
};
|
||||
|
||||
// valeur min et max OSC pour mappage des valeurs vers angle SERVO
|
||||
#define min_value 0
|
||||
#define max_value 1000
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
int osc_value[nb_servo]; // pour stockage valeur par servo
|
||||
int osc_value_old[nb_servo]; // pour stockage valeur osc
|
||||
int pulse;
|
||||
|
||||
void initEthernet()
|
||||
{
|
||||
SPI.begin();
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
|
||||
#if !USING_DHCP
|
||||
eth.config(localIP, gateway, netMask, gateway);
|
||||
#endif
|
||||
|
||||
eth.setDefault();
|
||||
|
||||
if (!eth.begin())
|
||||
{
|
||||
Serial.println("No Ethernet hardware ... Stop here");
|
||||
|
||||
while (true)
|
||||
{
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.print("Connecting to network : ");
|
||||
|
||||
while (!eth.connected())
|
||||
{
|
||||
Serial.print(".");
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println();
|
||||
|
||||
#if USING_DHCP
|
||||
Serial.print("Ethernet DHCP IP address: ");
|
||||
#else
|
||||
Serial.print("Ethernet Static IP address: ");
|
||||
#endif
|
||||
|
||||
Serial.println(eth.localIP());
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
initEthernet();
|
||||
// Déifinition des cartes de I2C/PWM
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
delay(100);
|
||||
|
||||
// centrage des servo
|
||||
Serial.println("CENTRAGE CORBAC");
|
||||
Serial.println("--------------- ---------------------");
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
Serial.print(".");
|
||||
}
|
||||
|
||||
delay(100);
|
||||
Serial.println("CORBAC I2C START");
|
||||
Serial.println("------------------------------------");
|
||||
} // fin setup
|
||||
|
||||
void loop() { // Main loop
|
||||
OSCMessage msgIN;
|
||||
|
||||
udp.onPacket([](AsyncUDPPacket packet)
|
||||
{
|
||||
msgIN.fill(parsePacket(packet));
|
||||
|
||||
if (!msgIN.hasError()) {
|
||||
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// pour appel fonction reception adresse osc;
|
||||
|
||||
definir dans le main loop :
|
||||
msgIN.route("/ADDRESSEOSC", ADDRESSEOSC);
|
||||
|
||||
definir numero de moteur pour variable servo servo_select = NUMERO DE MOTEUR;;
|
||||
utilisé la même adresse OSC pour la fonction comme indiqué plus bas
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
msgIN.route("/gd1", gd1);
|
||||
msgIN.route("/gd2", gd2);
|
||||
msgIN.route("/gd3", gd3);
|
||||
msgIN.route("/gd4", gd4);
|
||||
msgIN.route("/gd5", gd5);
|
||||
msgIN.route("/gd6", gd6);
|
||||
msgIN.route("/gd7", gd7);
|
||||
msgIN.route("/gd8", gd8);
|
||||
|
||||
msgIN.route("/c1", c1);
|
||||
msgIN.route("/c2", c2);
|
||||
msgIN.route("/c3", c3);
|
||||
msgIN.route("/c4", c4);
|
||||
msgIN.route("/c5", c5);
|
||||
msgIN.route("/c6", c6);
|
||||
msgIN.route("/c7", c7);
|
||||
msgIN.route("/c8", c8);
|
||||
msgIN.route("/c9", c9);
|
||||
msgIN.route("/c10", c10);
|
||||
msgIN.route("/c11", c11);
|
||||
msgIN.route("/c12", c12);
|
||||
msgIN.route("/c13", c13);
|
||||
msgIN.route("/c14", c14);
|
||||
msgIN.route("/c15", c15);
|
||||
msgIN.route("/c16", c16);
|
||||
|
||||
msgIN.route("/sheep", sheep);
|
||||
msgIN.route("/badger", badger);
|
||||
msgIN.route("/cow1", cow1);
|
||||
msgIN.route("/cow2", cow2);
|
||||
|
||||
Serial.println("Reception d'un message OSC");
|
||||
//pour detection de mise à jour des valeur de servo
|
||||
for (int servo_select = 0; servo_select < nb_servo ; servo_select++) {
|
||||
if (osc_value_old[servo_select] != osc_value[servo_select]) // si servo doit etre mis à jour avec nouvelle valeur OSC reçu
|
||||
{
|
||||
int servo_value = map(osc_value[servo_select], min_value, max_value, -90, 90);
|
||||
pulse = map(servo_value, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
//if (pulse[servo_select] != pulse_old[servo_select]) {
|
||||
Serial.println("------------------------------------");
|
||||
Serial.print("mise à jour position moteur n° : ");
|
||||
Serial.println(servo_select);
|
||||
Serial.print("valeur osc : ");
|
||||
Serial.print(osc_value[servo_select]);
|
||||
Serial.print(" ------ valeur pulse : ");
|
||||
Serial.println(pulse);
|
||||
// selection de la carte de sortie
|
||||
// moteur sur carte 1
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
}
|
||||
// moteur sur carte 2
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
}
|
||||
// moteur sur carte 3
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
}
|
||||
//pulse_old[servo_select] = pulse[servo_select]; // mise a jour variable ancienne valeur de moteur
|
||||
//}
|
||||
|
||||
osc_value_old[servo_select] = osc_value[servo_select];
|
||||
} // fin de mise à jour servo
|
||||
} // fin detection pour mise à jour servo
|
||||
//udp.stop(); //restart with new connection to receive packets from other clients
|
||||
} // fin message UDP OSC reçu
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
} // fin mail loop
|
||||
|
||||
|
||||
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------
|
||||
// Fonction reception adresse osc;
|
||||
|
||||
definir dans le main loop :
|
||||
msgIN.route("/ADDRESSEOSC", ADDRESSEOSC);
|
||||
|
||||
definir numero de moteur pour variable servo servo_select = NUMERO DE MOTEUR;;
|
||||
utilisé la même adresse OSC définie comme indiqué plus haut dans le main
|
||||
|
||||
void ADDRESSEOSC(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = NUMERO DE MOTEUR;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
void gd1(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 0;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd2(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 1;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd3(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 10;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd4(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 11;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd5(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 16;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd6(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 17;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd7(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 26;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd8(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 27;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void c1(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 4;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c2(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 5;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c3(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 6;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c4(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 7;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c5(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 12;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c6(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 13;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c7(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 14;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c8(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 15;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c9(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 20;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c10(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 21;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c11(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 22;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c12(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 23;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c13(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 28;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c14(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 29;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c15(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 30;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c16(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 31;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
void sheep(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 32;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void badger(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 33;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow1(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 34;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow2(OSCMessage & msg, int addrOffset ) {
|
||||
servo_select = 35;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// Définition valeur servo, utilisé le fichier excel pour modifier les valeur :
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MIN0 230
|
||||
#define MAX0 530
|
||||
#define BOOT0 0
|
||||
#define MIN1 230
|
||||
#define MAX1 530
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 120
|
||||
#define MAX4 350
|
||||
#define BOOT4 -90
|
||||
#define MIN5 145
|
||||
#define MAX5 330
|
||||
#define BOOT5 -90
|
||||
#define MIN6 125
|
||||
#define MAX6 300
|
||||
#define BOOT6 -90
|
||||
#define MIN7 115
|
||||
#define MAX7 300
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 210
|
||||
#define MAX10 530
|
||||
#define BOOT10 0
|
||||
#define MIN11 220
|
||||
#define MAX11 520
|
||||
#define BOOT11 0
|
||||
#define MIN12 120
|
||||
#define MAX12 300
|
||||
#define BOOT12 -90
|
||||
#define MIN13 120
|
||||
#define MAX13 320
|
||||
#define BOOT13 -90
|
||||
#define MIN14 120
|
||||
#define MAX14 320
|
||||
#define BOOT14 -90
|
||||
#define MIN15 120
|
||||
#define MAX15 320
|
||||
#define BOOT15 -90
|
||||
#define MIN16 220
|
||||
#define MAX16 510
|
||||
#define BOOT16 0
|
||||
#define MIN17 180
|
||||
#define MAX17 510
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 100
|
||||
#define MAX20 260
|
||||
#define BOOT20 -90
|
||||
#define MIN21 100
|
||||
#define MAX21 290
|
||||
#define BOOT21 -90
|
||||
#define MIN22 100
|
||||
#define MAX22 300
|
||||
#define BOOT22 -90
|
||||
#define MIN23 100
|
||||
#define MAX23 250
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 220
|
||||
#define MAX26 510
|
||||
#define BOOT26 0
|
||||
#define MIN27 210
|
||||
#define MAX27 510
|
||||
#define BOOT27 0
|
||||
#define MIN28 100
|
||||
#define MAX28 240
|
||||
#define BOOT28 -90
|
||||
#define MIN29 100
|
||||
#define MAX29 300
|
||||
#define BOOT29 -90
|
||||
#define MIN30 110
|
||||
#define MAX30 270
|
||||
#define BOOT30 -90
|
||||
#define MIN31 100
|
||||
#define MAX31 250
|
||||
#define BOOT31 -90
|
||||
#define MIN32 100
|
||||
#define MAX32 170
|
||||
#define BOOT32 -90
|
||||
#define MIN33 100
|
||||
#define MAX33 160
|
||||
#define BOOT33 -90
|
||||
#define MIN34 100
|
||||
#define MAX34 190
|
||||
#define BOOT34 0
|
||||
#define MIN35 100
|
||||
#define MAX35 440
|
||||
#define BOOT35 -90
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
#define MIN49 0
|
||||
#define MAX49 0
|
||||
#define BOOT49 0
|
||||
#define MIN50 0
|
||||
#define MAX50 12500
|
||||
#define BOOT50 90
|
||||
#define MIN51 0
|
||||
#define MAX51 12500
|
||||
#define BOOT51 90
|
||||
#define MIN52 0
|
||||
#define MAX52 12500
|
||||
#define BOOT52 90
|
||||
#define MIN53 0
|
||||
#define MAX53 12500
|
||||
#define BOOT53 90
|
||||
#define MIN54 0
|
||||
#define MAX54 12500
|
||||
#define BOOT54 90
|
||||
#define MIN55 0
|
||||
#define MAX55 0
|
||||
#define BOOT55 0
|
||||
#define MIN56 0
|
||||
#define MAX56 0
|
||||
#define BOOT56 0
|
||||
#define MIN57 0
|
||||
#define MAX57 0
|
||||
#define BOOT57 0
|
||||
#define MIN58 0
|
||||
#define MAX58 0
|
||||
#define BOOT58 0
|
||||
#define MIN59 0
|
||||
#define MAX59 0
|
||||
#define BOOT59 0
|
||||
#define MIN60 0
|
||||
#define MAX60 0
|
||||
#define BOOT560 0
|
||||
@@ -0,0 +1,74 @@
|
||||
/****************************************************************************************************************************
|
||||
defines.h
|
||||
|
||||
For ESP8266 with lwIP_5100, lwIP_5500 or lwIP_enc28j60 library
|
||||
|
||||
AsyncUDP_Ethernet is a Async UDP library for the ESP8266 with lwIP_5100, lwIP_5500 or lwIP_enc28j60 library
|
||||
|
||||
Based on and modified from ESPAsyncUDP Library (https://github.com/me-no-dev/ESPAsyncUDP)
|
||||
Built by Khoi Hoang https://github.com/khoih-prog/ASYNC_UDP_Ethernet
|
||||
*****************************************************************************************************************************/
|
||||
|
||||
#ifndef defines_h
|
||||
#define defines_h
|
||||
|
||||
#if defined(ESP8266)
|
||||
#define LED_ON LOW
|
||||
#define LED_OFF HIGH
|
||||
#else
|
||||
#error Only ESP8266
|
||||
#endif
|
||||
|
||||
#define _AWS_ETHERNET_LOGLEVEL_ 1
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
#define USING_W5500 false
|
||||
#define USING_W5100 false
|
||||
#define USING_ENC28J60 true
|
||||
|
||||
#include <SPI.h>
|
||||
|
||||
#define CSPIN 15 // 5
|
||||
|
||||
#if USING_W5500
|
||||
#include "W5500lwIP.h"
|
||||
#define SHIELD_TYPE "ESP8266_W5500 Ethernet"
|
||||
|
||||
Wiznet5500lwIP eth(CSPIN);
|
||||
|
||||
#elif USING_W5100
|
||||
#include <W5100lwIP.h>
|
||||
#define SHIELD_TYPE "ESP8266_W5100 Ethernet"
|
||||
|
||||
Wiznet5100lwIP eth(CSPIN);
|
||||
|
||||
#elif USING_ENC28J60
|
||||
#include <ENC28J60lwIP.h>
|
||||
#define SHIELD_TYPE "ESP8266_ENC28J60 Ethernet"
|
||||
|
||||
ENC28J60lwIP eth(CSPIN);
|
||||
#else
|
||||
// default if none selected
|
||||
#include "W5500lwIP.h"
|
||||
|
||||
Wiznet5500lwIP eth(CSPIN);
|
||||
#endif
|
||||
|
||||
#include <WiFiClient.h> // WiFiClient (-> TCPClient)
|
||||
|
||||
using TCPClient = WiFiClient;
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
#define USING_DHCP false
|
||||
|
||||
#if !USING_DHCP
|
||||
IPAddress localIP(192, 168, 2, 115);
|
||||
IPAddress gateway(192, 168, 2, 1);
|
||||
IPAddress netMask(255, 255, 255, 0);
|
||||
#endif
|
||||
|
||||
#include <AsyncUDP_Ethernet.h> // https://github.com/khoih-prog/AsyncUDP_Ethernet
|
||||
|
||||
#endif //defines_h
|
||||
@@ -0,0 +1,403 @@
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
OSC to I2C CORBACS Show pour les amis nos morts v0.1a 06/2022 06/2022
|
||||
https://www.facebook.com/LesAmisNosMorts/
|
||||
https://lesamisnosmorts.fr/
|
||||
https://www.youtube.com/watch?v=2guq3Z296mI&list=PLyRucERHaznPcJ69G39vllQ96x3izfdkT
|
||||
|
||||
Conception artistique : Guillaume dalin
|
||||
lesamisnosmorts@gmail.com / +33676745128
|
||||
|
||||
Code par Clément SAILLANT / EcObsolent
|
||||
c.saillant@gmail.com / +33625334420
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "config.h" // fichier de Définition des valeur de servo
|
||||
|
||||
#define DEBUG 0 // 1 pour activer le debug serie
|
||||
|
||||
// ethernet et OSC
|
||||
#include <SPI.h>
|
||||
#ifdef ESP8266
|
||||
#include <ESP8266WiFi.h>
|
||||
#else
|
||||
#include <WiFi.h>
|
||||
#endif
|
||||
#include <WiFiUdp.h>
|
||||
|
||||
//Use youre mac and ip here---------------------------
|
||||
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x9B, 0x7F };
|
||||
byte ip[] = { 192, 168, 2, 115 };
|
||||
//----------------------------------------------------
|
||||
|
||||
char ssid[] = "La-clic"; // your network SSID (name)
|
||||
char pass[] = "clic clac"; // your network password
|
||||
|
||||
// A UDP instance to let us send and receive packets over UDP
|
||||
WiFiUDP Udp;
|
||||
|
||||
|
||||
// OSC--------------------------
|
||||
//port numbers
|
||||
const unsigned int localPort = 10000;
|
||||
#include <OSCBundle.h>
|
||||
#include <OSCBoards.h>
|
||||
#include <OSCMessage.h>
|
||||
|
||||
OSCErrorCode error;
|
||||
unsigned int ledState = LOW; // LOW means led is *on*
|
||||
|
||||
#ifndef BUILTIN_LED
|
||||
#ifdef LED_BUILTIN
|
||||
#define BUILTIN_LED LED_BUILTIN
|
||||
#else
|
||||
#define BUILTIN_LED 13
|
||||
#endif
|
||||
#endif
|
||||
//----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// valeur min et max OSC pour mappage des valeurs vers angle SERVO
|
||||
#define min_value 0
|
||||
#define max_value 1000
|
||||
|
||||
|
||||
|
||||
// I2C et carte PWM(servo)
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
// Depending on your servo make, the pulse width min and max may vary, you
|
||||
// want these to be as small/large as possible without hitting the hard stop
|
||||
// for max range. You'll have to tweak them as necessary to match the servos you
|
||||
// have!
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
|
||||
//Driver :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
|
||||
//Servos :
|
||||
#define nb_servo 49 // Nombre de servo controlés
|
||||
|
||||
int servo_select = 0; // variable de selection servo
|
||||
int osc_value[nb_servo]; // pour stockage valeur par servo
|
||||
int osc_value_old[nb_servo]; // pour comparaison si changement de valeur
|
||||
int pulse = 0;
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}; // défini sur quelle voie du driver sera branché chaque servomoteurs
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48
|
||||
};
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
pinMode(BUILTIN_LED, OUTPUT);
|
||||
digitalWrite(BUILTIN_LED, ledState); // turn *on* led
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
// Connect to WiFi network
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.print("Connecting to ");
|
||||
Serial.println(ssid);
|
||||
WiFi.begin(ssid, pass);
|
||||
|
||||
while (WiFi.status() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
}
|
||||
Serial.println("");
|
||||
|
||||
Serial.println("WiFi connected");
|
||||
Serial.println("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
Serial.println("Starting UDP");
|
||||
Udp.begin(localPort);
|
||||
Serial.print("Local port: ");
|
||||
#ifdef ESP32
|
||||
Serial.println(localPort);
|
||||
#else
|
||||
Serial.println(Udp.localPort());
|
||||
#endif
|
||||
|
||||
// Déifinition des cartes de I2C/PWM
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
// centrage des servo
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
//Debug Mode enable in case DEBUG equal 1
|
||||
//Serial.begin(115200);
|
||||
delay(100);
|
||||
Serial.println("CORBAC I2C START");
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
||||
void led(OSCMessage &msg) {
|
||||
ledState = msg.getInt(0);
|
||||
digitalWrite(BUILTIN_LED, ledState);
|
||||
Serial.print("/led: ");
|
||||
Serial.println(ledState);
|
||||
}
|
||||
|
||||
void loop() { // Main loop
|
||||
OSCMessage msgIN;
|
||||
int size;
|
||||
|
||||
if ( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while (size--)
|
||||
msgIN.fill(Udp.read());
|
||||
|
||||
if (!msgIN.hasError()) {
|
||||
|
||||
msgIN.route("/gd1", gd1);
|
||||
msgIN.route("/gd2", gd2);
|
||||
msgIN.route("/gd3", gd3);
|
||||
msgIN.route("/gd4", gd4);
|
||||
msgIN.route("/gd5", gd5);
|
||||
msgIN.route("/gd6", gd6);
|
||||
msgIN.route("/gd7", gd7);
|
||||
msgIN.route("/gd8", gd8);
|
||||
|
||||
msgIN.route("/c1", c1);
|
||||
msgIN.route("/c2", c2);
|
||||
msgIN.route("/c3", c3);
|
||||
msgIN.route("/c4", c4);
|
||||
msgIN.route("/c5", c5);
|
||||
msgIN.route("/c6", c6);
|
||||
msgIN.route("/c7", c7);
|
||||
msgIN.route("/c8", c8);
|
||||
msgIN.route("/c9", c9);
|
||||
msgIN.route("/c10", c10);
|
||||
msgIN.route("/c11", c11);
|
||||
msgIN.route("/c12", c12);
|
||||
msgIN.route("/c13", c13);
|
||||
msgIN.route("/c14", c14);
|
||||
msgIN.route("/c15", c15);
|
||||
msgIN.route("/c16", c16);
|
||||
|
||||
msgIN.route("/sheep", sheep);
|
||||
msgIN.route("/badger", badger);
|
||||
msgIN.route("/cow1", cow1);
|
||||
msgIN.route("/cow2", cow2);
|
||||
|
||||
//Serial.println("OSC alive! ");
|
||||
}
|
||||
|
||||
}
|
||||
// mise à jour des valeur de servo
|
||||
|
||||
for (int servo_select = 0; servo_select < nb_servo ; servo_select++) {
|
||||
if (osc_value_old[servo_select] != osc_value[servo_select])
|
||||
{
|
||||
#ifdef DEBUG
|
||||
//Serial.println("mise à jour position moteur");
|
||||
#endif
|
||||
|
||||
osc_value_old[servo_select] = osc_value[servo_select];
|
||||
int servo_value = map(osc_value[servo_select], min_value, max_value, -90, 90);
|
||||
pulse = map(servo_value, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 1");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 2");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 3");
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
//Serial.print("moteur : ");
|
||||
//Serial.println(servo_select);
|
||||
//Serial.print("valeur osc : ");
|
||||
//Serial.println(osc_value[servo_select]);
|
||||
//Serial.print("valeur pulse : ");
|
||||
//Serial.println(pulse);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Fonction reception adresse osc;
|
||||
//definir numero de servo servo_select = 0;
|
||||
|
||||
void gd1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 0;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 1;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 10;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 11;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 16;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 17;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 26;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 27;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void c1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 4;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 5;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 6;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 7;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 12;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 13;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 14;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 15;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c9(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 20;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c10(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 21;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c11(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 22;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c12(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 23;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c13(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 28;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c14(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 29;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c15(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 30;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c16(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 31;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
void sheep(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 32;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void badger(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 33;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 34;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 35;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// Définition valeur servo, utilisé le fichier excel pour modifier les valeur :
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MIN0 230
|
||||
#define MAX0 530
|
||||
#define BOOT0 0
|
||||
#define MIN1 230
|
||||
#define MAX1 530
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 120
|
||||
#define MAX4 350
|
||||
#define BOOT4 -90
|
||||
#define MIN5 145
|
||||
#define MAX5 330
|
||||
#define BOOT5 -90
|
||||
#define MIN6 125
|
||||
#define MAX6 300
|
||||
#define BOOT6 -90
|
||||
#define MIN7 115
|
||||
#define MAX7 300
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 210
|
||||
#define MAX10 530
|
||||
#define BOOT10 0
|
||||
#define MIN11 220
|
||||
#define MAX11 520
|
||||
#define BOOT11 0
|
||||
#define MIN12 120
|
||||
#define MAX12 300
|
||||
#define BOOT12 -90
|
||||
#define MIN13 120
|
||||
#define MAX13 320
|
||||
#define BOOT13 -90
|
||||
#define MIN14 120
|
||||
#define MAX14 320
|
||||
#define BOOT14 -90
|
||||
#define MIN15 120
|
||||
#define MAX15 320
|
||||
#define BOOT15 -90
|
||||
#define MIN16 220
|
||||
#define MAX16 510
|
||||
#define BOOT16 0
|
||||
#define MIN17 180
|
||||
#define MAX17 510
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 100
|
||||
#define MAX20 260
|
||||
#define BOOT20 -90
|
||||
#define MIN21 100
|
||||
#define MAX21 290
|
||||
#define BOOT21 -90
|
||||
#define MIN22 100
|
||||
#define MAX22 300
|
||||
#define BOOT22 -90
|
||||
#define MIN23 100
|
||||
#define MAX23 250
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 220
|
||||
#define MAX26 510
|
||||
#define BOOT26 0
|
||||
#define MIN27 210
|
||||
#define MAX27 510
|
||||
#define BOOT27 0
|
||||
#define MIN28 100
|
||||
#define MAX28 240
|
||||
#define BOOT28 -90
|
||||
#define MIN29 100
|
||||
#define MAX29 300
|
||||
#define BOOT29 -90
|
||||
#define MIN30 110
|
||||
#define MAX30 270
|
||||
#define BOOT30 -90
|
||||
#define MIN31 100
|
||||
#define MAX31 250
|
||||
#define BOOT31 -90
|
||||
#define MIN32 100
|
||||
#define MAX32 170
|
||||
#define BOOT32 -90
|
||||
#define MIN33 100
|
||||
#define MAX33 160
|
||||
#define BOOT33 -90
|
||||
#define MIN34 100
|
||||
#define MAX34 190
|
||||
#define BOOT34 0
|
||||
#define MIN35 100
|
||||
#define MAX35 440
|
||||
#define BOOT35 -90
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
@@ -0,0 +1,408 @@
|
||||
//Bibliothèques LCD Keypad Shield
|
||||
#include <LiquidCrystal.h>
|
||||
// Création de l'objet lcd (avec les différents ports numériques qu'il utilise)
|
||||
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
|
||||
|
||||
//Bibliothèques servo moteur:
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
|
||||
// Variables
|
||||
int lcd_key = 0;
|
||||
int adc_key_in = 0;
|
||||
// Constantes
|
||||
#define btnRIGHT 0
|
||||
#define btnUP 1
|
||||
#define btnDOWN 2
|
||||
#define btnLEFT 3
|
||||
#define btnSELECT 4
|
||||
#define btnNONE 5
|
||||
|
||||
// Depending on your servo make, the pulse width min and max may vary, you
|
||||
// want these to be as small/large as possible without hitting the hard stop
|
||||
// for max range. You'll have to tweak them as necessary to match the servos you
|
||||
// have!
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
|
||||
#define nb_servo 49
|
||||
#define nb_board 3
|
||||
#define PAUSE 200
|
||||
|
||||
// Définition valeur servo, utilisé le fichier excel pour modifier les valeur :
|
||||
#define MIN0 130
|
||||
#define MAX0 620
|
||||
#define BOOT0 0
|
||||
#define MIN1 130
|
||||
#define MAX1 620
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 130
|
||||
#define MAX4 375
|
||||
#define BOOT4 -90
|
||||
#define MIN5 130
|
||||
#define MAX5 375
|
||||
#define BOOT5 -90
|
||||
#define MIN6 130
|
||||
#define MAX6 375
|
||||
#define BOOT6 -90
|
||||
#define MIN7 130
|
||||
#define MAX7 375
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 130
|
||||
#define MAX10 620
|
||||
#define BOOT10 0
|
||||
#define MIN11 130
|
||||
#define MAX11 620
|
||||
#define BOOT11 0
|
||||
#define MIN12 130
|
||||
#define MAX12 375
|
||||
#define BOOT12 -90
|
||||
#define MIN13 130
|
||||
#define MAX13 375
|
||||
#define BOOT13 -90
|
||||
#define MIN14 130
|
||||
#define MAX14 375
|
||||
#define BOOT14 -90
|
||||
#define MIN15 130
|
||||
#define MAX15 375
|
||||
#define BOOT15 -90
|
||||
#define MIN16 130
|
||||
#define MAX16 620
|
||||
#define BOOT16 0
|
||||
#define MIN17 130
|
||||
#define MAX17 620
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 130
|
||||
#define MAX20 375
|
||||
#define BOOT20 -90
|
||||
#define MIN21 130
|
||||
#define MAX21 375
|
||||
#define BOOT21 -90
|
||||
#define MIN22 130
|
||||
#define MAX22 375
|
||||
#define BOOT22 -90
|
||||
#define MIN23 130
|
||||
#define MAX23 375
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 130
|
||||
#define MAX26 620
|
||||
#define BOOT26 0
|
||||
#define MIN27 130
|
||||
#define MAX27 620
|
||||
#define BOOT27 0
|
||||
#define MIN28 130
|
||||
#define MAX28 375
|
||||
#define BOOT28 -90
|
||||
#define MIN29 130
|
||||
#define MAX29 375
|
||||
#define BOOT29 -90
|
||||
#define MIN30 130
|
||||
#define MAX30 375
|
||||
#define BOOT30 -90
|
||||
#define MIN31 130
|
||||
#define MAX31 375
|
||||
#define BOOT31 -90
|
||||
#define MIN32 130
|
||||
#define MAX32 375
|
||||
#define BOOT32 0
|
||||
#define MIN33 130
|
||||
#define MAX33 375
|
||||
#define BOOT33 0
|
||||
#define MIN34 130
|
||||
#define MAX34 620
|
||||
#define BOOT34 0
|
||||
#define MIN35 130
|
||||
#define MAX35 620
|
||||
#define BOOT35 0
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
|
||||
int servo_select = 16;
|
||||
int mode_select = 0;
|
||||
int angle_servo = 0;
|
||||
int pulse = 0;
|
||||
|
||||
//Driver :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
//Servos :
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}; // défini sur quelle voie du driver sera branché chaque servomoteurs
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48
|
||||
};
|
||||
void setup()
|
||||
{
|
||||
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
lcd.begin(16, 2); // Démarrage de l'écran
|
||||
lcd.clear();
|
||||
|
||||
// centrage des servo
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("SERVO ");
|
||||
lcd.print(i);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("CENTER");
|
||||
delay(PAUSE / 10);
|
||||
}
|
||||
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0); // Positionnement du curseur au début
|
||||
lcd.print("CORBACS MIDI CC"); // Message
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("INIT OK");
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
lcd_key = read_LCD_buttons(); // Lecture des touches
|
||||
switch (lcd_key) // Action en cas de touche pressée
|
||||
{
|
||||
case btnRIGHT: // incrémente l'angle de 1°
|
||||
{
|
||||
if (angle_servo < 90) {
|
||||
angle_servo++;
|
||||
}
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("SERVO ");
|
||||
lcd.print(servo_select);
|
||||
lcd.print(" ANG ");
|
||||
lcd.print(angle_servo);
|
||||
servo_boot[servo_select] = angle_servo;
|
||||
pulse = map(angle_servo, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
}
|
||||
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
}
|
||||
|
||||
|
||||
delay(PAUSE);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("PULSE : ");
|
||||
lcd.print(pulse);
|
||||
break;
|
||||
}
|
||||
|
||||
case btnLEFT: // diminue l'angle de 1°
|
||||
{
|
||||
if (angle_servo > -90) {
|
||||
angle_servo--;
|
||||
}
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("SERVO ");
|
||||
lcd.print(servo_select);
|
||||
lcd.print(" ANG ");
|
||||
lcd.print(angle_servo);
|
||||
// mets a jour la valeur d'angle par servo
|
||||
servo_boot[servo_select] = angle_servo;
|
||||
pulse = map(angle_servo, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
}
|
||||
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
}
|
||||
|
||||
delay(PAUSE);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("PULSE : ");
|
||||
lcd.print(pulse);
|
||||
break;
|
||||
}
|
||||
|
||||
case btnDOWN: // change de servo ++
|
||||
{
|
||||
if (servo_select < nb_servo - 1) {
|
||||
servo_select++;
|
||||
}
|
||||
else if (servo_select >= nb_servo - 1) {
|
||||
servo_select = 0;
|
||||
}
|
||||
// mets a jour la valeur d'angle par servo
|
||||
angle_servo = servo_boot[servo_select];
|
||||
pulse = map(angle_servo, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("SERVO ");
|
||||
lcd.print(servo_select);
|
||||
lcd.print(" ANG ");
|
||||
lcd.print(angle_servo);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("PULSE : ");
|
||||
lcd.print(pulse);
|
||||
delay(PAUSE);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case btnUP: // change de servo --
|
||||
{
|
||||
if (servo_select > 0) {
|
||||
servo_select--;
|
||||
}
|
||||
else if (servo_select <= 0) {
|
||||
servo_select = nb_servo - 1;
|
||||
}
|
||||
// mets a jour la valeur d'angle par servo
|
||||
angle_servo = servo_boot[servo_select];
|
||||
pulse = map(angle_servo, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("SERVO ");
|
||||
lcd.print(servo_select);
|
||||
lcd.print(" ANG ");
|
||||
lcd.print(angle_servo);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("PULSE : ");
|
||||
lcd.print(pulse);
|
||||
delay(PAUSE);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
case btnSELECT: // centrage des servo
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case btnNONE:
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Fonction de lecture des touches
|
||||
int read_LCD_buttons()
|
||||
{
|
||||
adc_key_in = analogRead(0); // Lecture du port analogique
|
||||
// Les valeurs qui suivent doivent être adaptées au shield
|
||||
if (adc_key_in > 900) return btnNONE; // En principe 1023 quand aucune touche n'est pressée
|
||||
if (adc_key_in < 50) return btnRIGHT; // 0
|
||||
if (adc_key_in < 195) return btnUP; // 99
|
||||
if (adc_key_in < 380) return btnDOWN; // 255
|
||||
if (adc_key_in < 555) return btnLEFT; // 409
|
||||
if (adc_key_in < 790) return btnSELECT; // 640
|
||||
return btnNONE;
|
||||
}
|
||||
@@ -0,0 +1,363 @@
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
OSC to I2C CORBACS Show pour les amis nos morts v0.1a 06/2022 06/2022
|
||||
https://www.facebook.com/LesAmisNosMorts/
|
||||
https://lesamisnosmorts.fr/
|
||||
https://www.youtube.com/watch?v=2guq3Z296mI&list=PLyRucERHaznPcJ69G39vllQ96x3izfdkT
|
||||
|
||||
Conception artistique : Guillaume dalin
|
||||
lesamisnosmorts@gmail.com / +33676745128
|
||||
|
||||
Code par Clément SAILLANT / EcObsolent
|
||||
c.saillant@gmail.com / +33625334420
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "config.h" // fichier de Définition des valeur de servo
|
||||
|
||||
#define DEBUG 0 // 1 pour activer le debug serie
|
||||
#define DEBUG 0 // 1 pour activer le mode DEBUG en debug
|
||||
|
||||
// ethernet et OSC
|
||||
#include <SPI.h>
|
||||
#include <NativeEthernet.h>
|
||||
#include <EthernetUdp.h>
|
||||
|
||||
//Use youre mac and ip here---------------------------
|
||||
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x9B, 0x7F };
|
||||
byte ip[] = { 192, 168, 2, 115 };
|
||||
//----------------------------------------------------
|
||||
|
||||
EthernetUDP Udp;
|
||||
|
||||
// OSC--------------------------
|
||||
//port numbers
|
||||
const int osc_server_port = 10000;
|
||||
#include <OSCBundle.h>
|
||||
#include <OSCBoards.h>
|
||||
//----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// valeur min et max OSC pour mappage des valeurs vers angle SERVO
|
||||
#define min_value 0
|
||||
#define max_value 1000
|
||||
|
||||
|
||||
|
||||
// I2C et carte PWM(servo)
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
// Depending on your servo make, the pulse width min and max may vary, you
|
||||
// want these to be as small/large as possible without hitting the hard stop
|
||||
// for max range. You'll have to tweak them as necessary to match the servos you
|
||||
// have!
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
|
||||
//Driver :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
|
||||
//Servos :
|
||||
#define nb_servo 49 // Nombre de servo controlés
|
||||
|
||||
int servo_select = 0; // variable de selection servo
|
||||
int osc_value[nb_servo]; // pour stockage valeur par servo
|
||||
int osc_value_old[nb_servo]; // pour comparaison si changement de valeur
|
||||
int pulse = 0;
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}; // défini sur quelle voie du driver sera branché chaque servomoteurs
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48
|
||||
};
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
//disable sd card
|
||||
pinMode(4, OUTPUT);
|
||||
digitalWrite(4, HIGH);
|
||||
delay(1);
|
||||
|
||||
// start the Ethernet connection:
|
||||
Ethernet.begin(mac, ip);
|
||||
Udp.begin(osc_server_port);
|
||||
|
||||
// Déifinition des cartes de I2C/PWM
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
// centrage des servo
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
//Debug Mode enable in case DEBUG equal 1
|
||||
//Serial.begin(115200);
|
||||
delay(100);
|
||||
//Serial.println("CORBAC I2C START");
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
// print your local IP address:
|
||||
//Serial.print("Arduino IP address: ");
|
||||
//Serial.println(Ethernet.localIP());
|
||||
//Serial.print("OSC Port ");
|
||||
//Serial.println(osc_server_port);
|
||||
//Serial.println("Setup done.");
|
||||
|
||||
}
|
||||
|
||||
void loop() { // Main loop
|
||||
OSCMessage msgIN;
|
||||
int size;
|
||||
|
||||
if ( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while (size--)
|
||||
msgIN.fill(Udp.read());
|
||||
|
||||
if (!msgIN.hasError()) {
|
||||
|
||||
msgIN.route("/gd1", gd1);
|
||||
msgIN.route("/gd2", gd2);
|
||||
msgIN.route("/gd3", gd3);
|
||||
msgIN.route("/gd4", gd4);
|
||||
msgIN.route("/gd5", gd5);
|
||||
msgIN.route("/gd6", gd6);
|
||||
msgIN.route("/gd7", gd7);
|
||||
msgIN.route("/gd8", gd8);
|
||||
|
||||
msgIN.route("/c1", c1);
|
||||
msgIN.route("/c2", c2);
|
||||
msgIN.route("/c3", c3);
|
||||
msgIN.route("/c4", c4);
|
||||
msgIN.route("/c5", c5);
|
||||
msgIN.route("/c6", c6);
|
||||
msgIN.route("/c7", c7);
|
||||
msgIN.route("/c8", c8);
|
||||
msgIN.route("/c9", c9);
|
||||
msgIN.route("/c10", c10);
|
||||
msgIN.route("/c11", c11);
|
||||
msgIN.route("/c12", c12);
|
||||
msgIN.route("/c13", c13);
|
||||
msgIN.route("/c14", c14);
|
||||
msgIN.route("/c15", c15);
|
||||
msgIN.route("/c16", c16);
|
||||
|
||||
msgIN.route("/sheep", sheep);
|
||||
msgIN.route("/badger", badger);
|
||||
msgIN.route("/cow1", cow1);
|
||||
msgIN.route("/cow2", cow2);
|
||||
|
||||
//Serial.println("OSC alive! ");
|
||||
}
|
||||
|
||||
}
|
||||
// mise à jour des valeur de servo
|
||||
|
||||
for (int servo_select = 0; servo_select < nb_servo ; servo_select++) {
|
||||
if (osc_value_old[servo_select] != osc_value[servo_select])
|
||||
{
|
||||
#ifdef DEBUG
|
||||
//Serial.println("mise à jour position moteur");
|
||||
#endif
|
||||
|
||||
osc_value_old[servo_select] = osc_value[servo_select];
|
||||
int servo_value = map(osc_value[servo_select], min_value, max_value, -90, 90);
|
||||
pulse = map(servo_value, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 1");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 2");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 3");
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
//Serial.print("moteur : ");
|
||||
//Serial.println(servo_select);
|
||||
//Serial.print("valeur osc : ");
|
||||
//Serial.println(osc_value[servo_select]);
|
||||
//Serial.print("valeur pulse : ");
|
||||
//Serial.println(pulse);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Fonction server.addCallback("/corbac/gd1", &gd1);
|
||||
//definir numero de servo osc_value[N° SERVO] pour get 1st argument(int32)
|
||||
|
||||
void gd1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 0;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 1;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 10;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 11;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 16;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 17;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 26;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 27;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void c1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 4;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 5;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 6;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 7;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 12;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 13;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 14;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 15;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c9(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 20;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c10(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 21;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c11(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 22;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c12(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 23;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c13(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 28;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c14(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 29;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c15(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 30;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c16(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 31;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
void sheep(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 32;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void badger(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 33;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 34;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 35;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
/*// -------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
// Définition valeur servo, utilisé le fichier excel pour modifier les valeur :
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
#define MIN0 230
|
||||
#define MAX0 530
|
||||
#define BOOT0 0
|
||||
#define MIN1 230
|
||||
#define MAX1 530
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 120
|
||||
#define MAX4 350
|
||||
#define BOOT4 -90
|
||||
#define MIN5 145
|
||||
#define MAX5 330
|
||||
#define BOOT5 -90
|
||||
#define MIN6 125
|
||||
#define MAX6 300
|
||||
#define BOOT6 -90
|
||||
#define MIN7 115
|
||||
#define MAX7 300
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 210
|
||||
#define MAX10 530
|
||||
#define BOOT10 0
|
||||
#define MIN11 220
|
||||
#define MAX11 520
|
||||
#define BOOT11 0
|
||||
#define MIN12 120
|
||||
#define MAX12 300
|
||||
#define BOOT12 -90
|
||||
#define MIN13 120
|
||||
#define MAX13 320
|
||||
#define BOOT13 -90
|
||||
#define MIN14 120
|
||||
#define MAX14 320
|
||||
#define BOOT14 -90
|
||||
#define MIN15 120
|
||||
#define MAX15 320
|
||||
#define BOOT15 -90
|
||||
#define MIN16 220
|
||||
#define MAX16 510
|
||||
#define BOOT16 0
|
||||
#define MIN17 180
|
||||
#define MAX17 510
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 100
|
||||
#define MAX20 260
|
||||
#define BOOT20 -90
|
||||
#define MIN21 100
|
||||
#define MAX21 290
|
||||
#define BOOT21 -90
|
||||
#define MIN22 100
|
||||
#define MAX22 300
|
||||
#define BOOT22 -90
|
||||
#define MIN23 100
|
||||
#define MAX23 250
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 220
|
||||
#define MAX26 510
|
||||
#define BOOT26 0
|
||||
#define MIN27 210
|
||||
#define MAX27 510
|
||||
#define BOOT27 0
|
||||
#define MIN28 100
|
||||
#define MAX28 240
|
||||
#define BOOT28 -90
|
||||
#define MIN29 100
|
||||
#define MAX29 300
|
||||
#define BOOT29 -90
|
||||
#define MIN30 110
|
||||
#define MAX30 270
|
||||
#define BOOT30 -90
|
||||
#define MIN31 100
|
||||
#define MAX31 250
|
||||
#define BOOT31 -90
|
||||
#define MIN32 100
|
||||
#define MAX32 170
|
||||
#define BOOT32 -90
|
||||
#define MIN33 100
|
||||
#define MAX33 160
|
||||
#define BOOT33 -90
|
||||
#define MIN34 100
|
||||
#define MAX34 190
|
||||
#define BOOT34 0
|
||||
#define MIN35 100
|
||||
#define MAX35 440
|
||||
#define BOOT35 -90
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
@@ -0,0 +1,358 @@
|
||||
/*---------------------------------------------------------------------------------------------------------------------------------------------
|
||||
OSC to I2C CORBACS Show pour les amis nos morts v0.1a 06/2022 06/2022
|
||||
https://www.facebook.com/LesAmisNosMorts/
|
||||
https://lesamisnosmorts.fr/
|
||||
https://www.youtube.com/watch?v=2guq3Z296mI&list=PLyRucERHaznPcJ69G39vllQ96x3izfdkT
|
||||
|
||||
Conception artistique : Guillaume dalin
|
||||
lesamisnosmorts@gmail.com / +33676745128
|
||||
|
||||
Code par Clément SAILLANT / EcObsolent
|
||||
c.saillant@gmail.com / +33625334420
|
||||
---------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "config.h" // fichier de Définition des valeur de servo
|
||||
|
||||
#define DEBUG 0 // 1 pour activer le debug serie
|
||||
|
||||
// ethernet et OSC
|
||||
#include <SPI.h>
|
||||
#include <NativeEthernet.h>
|
||||
#include <NativeEthernetUdp.h>
|
||||
|
||||
//Use youre mac and ip here---------------------------
|
||||
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x9B, 0x7F };
|
||||
byte ip[] = { 192, 168, 2, 115 };
|
||||
//----------------------------------------------------
|
||||
|
||||
EthernetUDP Udp;
|
||||
|
||||
// OSC--------------------------
|
||||
//port numbers
|
||||
const int osc_server_port = 10000;
|
||||
#include <OSCBundle.h>
|
||||
#include <OSCBoards.h>
|
||||
//----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// valeur min et max OSC pour mappage des valeurs vers angle SERVO
|
||||
#define min_value 0
|
||||
#define max_value 1000
|
||||
|
||||
|
||||
|
||||
// I2C et carte PWM(servo)
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_PWMServoDriver.h>
|
||||
|
||||
// Depending on your servo make, the pulse width min and max may vary, you
|
||||
// want these to be as small/large as possible without hitting the hard stop
|
||||
// for max range. You'll have to tweak them as necessary to match the servos you
|
||||
// have!
|
||||
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
|
||||
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
|
||||
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates
|
||||
|
||||
//Driver :
|
||||
Adafruit_PWMServoDriver board1 = Adafruit_PWMServoDriver(0x40);
|
||||
Adafruit_PWMServoDriver board2 = Adafruit_PWMServoDriver(0x41);
|
||||
Adafruit_PWMServoDriver board3 = Adafruit_PWMServoDriver(0x42);
|
||||
|
||||
|
||||
//Servos :
|
||||
#define nb_servo 49 // Nombre de servo controlés
|
||||
|
||||
int servo_select = 0; // variable de selection servo
|
||||
int osc_value[nb_servo]; // pour stockage valeur par servo
|
||||
int osc_value_old[nb_servo]; // pour comparaison si changement de valeur
|
||||
int pulse = 0;
|
||||
uint8_t servomoteur[nb_servo] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}; // défini sur quelle voie du driver sera branché chaque servomoteurs
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour - 90°
|
||||
uint16_t servomoins90[nb_servo] = {
|
||||
MIN0 , MIN1 , MIN2 , MIN3 , MIN4 , MIN5 , MIN6 , MIN7 , MIN8 , MIN9 , MIN10 , MIN11 , MIN12 , MIN13 , MIN14 , MIN15 , MIN16 , MIN17 , MIN18 , MIN19 , MIN20 , MIN21 , MIN22 , MIN23 , MIN24 , MIN25 , MIN26 , MIN27 , MIN28 , MIN29 , MIN30 , MIN31 , MIN32 , MIN33 , MIN34 , MIN35 , MIN36 , MIN37 , MIN38 , MIN39 , MIN40 , MIN41 , MIN42 , MIN43 , MIN44 , MIN45 , MIN46 , MIN47 , MIN48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
uint16_t servoplus90[nb_servo] = {
|
||||
MAX0 , MAX1 , MAX2 , MAX3 , MAX4 , MAX5 , MAX6 , MAX7 , MAX8 , MAX9 , MAX10 , MAX11 , MAX12 , MAX13 , MAX14 , MAX15 , MAX16 , MAX17 , MAX18 , MAX19 , MAX20 , MAX21 , MAX22 , MAX23 , MAX24 , MAX25 , MAX26 , MAX27 , MAX28 , MAX29 , MAX30 , MAX31 , MAX32 , MAX33 , MAX34 , MAX35 , MAX36 , MAX37 , MAX38 , MAX39 , MAX40 , MAX41 , MAX42 , MAX43 , MAX44 , MAX45 , MAX46 , MAX47 , MAX48
|
||||
};
|
||||
|
||||
//Liste des longueurs minimum d'impulsions pour + 90°
|
||||
int servo_boot[nb_servo] = {
|
||||
BOOT0 , BOOT1 , BOOT2 , BOOT3 , BOOT4 , BOOT5 , BOOT6 , BOOT7 , BOOT8 , BOOT9 , BOOT10 , BOOT11 , BOOT12 , BOOT13 , BOOT14 , BOOT15 , BOOT16 , BOOT17 , BOOT18 , BOOT19 , BOOT20 , BOOT21 , BOOT22 , BOOT23 , BOOT24 , BOOT25 , BOOT26 , BOOT27 , BOOT28 , BOOT29 , BOOT30 , BOOT31 , BOOT32 , BOOT33 , BOOT34 , BOOT35 , BOOT36 , BOOT37 , BOOT38 , BOOT39 , BOOT40 , BOOT41 , BOOT42 , BOOT43 , BOOT44 , BOOT45 , BOOT46 , BOOT47 , BOOT48
|
||||
};
|
||||
|
||||
|
||||
|
||||
void setup() {
|
||||
|
||||
#ifdef DEBUG
|
||||
//Debug Mode enable in case DEBUG equal 1
|
||||
//Serial.begin(115200);
|
||||
//delay(5000);
|
||||
//Serial.println("CORBAC I2C START");
|
||||
|
||||
#endif
|
||||
|
||||
// start the Ethernet connection:
|
||||
Ethernet.begin(mac, ip);
|
||||
Udp.begin(osc_server_port);
|
||||
|
||||
// Déifinition des cartes de I2C/PWM
|
||||
board1.begin();
|
||||
board1.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
|
||||
|
||||
board2.begin();
|
||||
board2.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
board3.begin();
|
||||
board3.setPWMFreq(SERVO_FREQ);
|
||||
|
||||
// centrage des servo
|
||||
for (int i = 0; i < nb_servo ; i++) {
|
||||
pulse = map(servo_boot[i], -90, 90, servomoins90[i], servoplus90[i]);
|
||||
|
||||
// selection de la carte de sortie
|
||||
if (i <= 15) {
|
||||
board1.setPWM(servomoteur[i], 0, pulse);
|
||||
}
|
||||
if (i >= 16 && i < 32) {
|
||||
board2.setPWM(servomoteur[i - 16], 0, pulse);
|
||||
}
|
||||
if (i >= 32 && i < 48) {
|
||||
board3.setPWM(servomoteur[i - 32], 0, pulse);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// print your local IP address:
|
||||
//Serial.print("Arduino IP address: ");
|
||||
//Serial.println(Ethernet.localIP());
|
||||
//Serial.print("OSC Port ");
|
||||
//Serial.println(osc_server_port);
|
||||
//Serial.println("Setup done.");
|
||||
|
||||
}
|
||||
|
||||
void loop() { // Main loop
|
||||
OSCMessage msgIN;
|
||||
int size;
|
||||
|
||||
if ( (size = Udp.parsePacket()) > 0)
|
||||
{
|
||||
while (size--)
|
||||
msgIN.fill(Udp.read());
|
||||
|
||||
if (!msgIN.hasError()) {
|
||||
|
||||
msgIN.route("/gd1", gd1);
|
||||
msgIN.route("/gd2", gd2);
|
||||
msgIN.route("/gd3", gd3);
|
||||
msgIN.route("/gd4", gd4);
|
||||
msgIN.route("/gd5", gd5);
|
||||
msgIN.route("/gd6", gd6);
|
||||
msgIN.route("/gd7", gd7);
|
||||
msgIN.route("/gd8", gd8);
|
||||
|
||||
msgIN.route("/c1", c1);
|
||||
msgIN.route("/c2", c2);
|
||||
msgIN.route("/c3", c3);
|
||||
msgIN.route("/c4", c4);
|
||||
msgIN.route("/c5", c5);
|
||||
msgIN.route("/c6", c6);
|
||||
msgIN.route("/c7", c7);
|
||||
msgIN.route("/c8", c8);
|
||||
msgIN.route("/c9", c9);
|
||||
msgIN.route("/c10", c10);
|
||||
msgIN.route("/c11", c11);
|
||||
msgIN.route("/c12", c12);
|
||||
msgIN.route("/c13", c13);
|
||||
msgIN.route("/c14", c14);
|
||||
msgIN.route("/c15", c15);
|
||||
msgIN.route("/c16", c16);
|
||||
|
||||
msgIN.route("/sheep", sheep);
|
||||
msgIN.route("/badger", badger);
|
||||
msgIN.route("/cow1", cow1);
|
||||
msgIN.route("/cow2", cow2);
|
||||
|
||||
//Serial.println("OSC alive! ");
|
||||
}
|
||||
|
||||
}
|
||||
// mise à jour des valeur de servo
|
||||
|
||||
for (int servo_select = 0; servo_select < nb_servo ; servo_select++) {
|
||||
if (osc_value_old[servo_select] != osc_value[servo_select])
|
||||
{
|
||||
#ifdef DEBUG
|
||||
//Serial.println("mise à jour position moteur");
|
||||
#endif
|
||||
|
||||
osc_value_old[servo_select] = osc_value[servo_select];
|
||||
int servo_value = map(osc_value[servo_select], min_value, max_value, -90, 90);
|
||||
pulse = map(servo_value, -90, 90, servomoins90[servo_select], servoplus90[servo_select]);
|
||||
// selection de la carte de sortie
|
||||
if (servo_select <= 15) {
|
||||
board1.setPWM(servomoteur[servo_select], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 1");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 16 && servo_select < 32) {
|
||||
board2.setPWM(servomoteur[servo_select - 16], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 2");
|
||||
#endif
|
||||
}
|
||||
if (servo_select >= 32 && servo_select < 48) {
|
||||
board3.setPWM(servomoteur[servo_select - 32], 0, pulse);
|
||||
#ifdef DEBUG
|
||||
//Serial.println("sur carte 3");
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
//Serial.print("moteur : ");
|
||||
//Serial.println(servo_select);
|
||||
//Serial.print("valeur osc : ");
|
||||
//Serial.println(osc_value[servo_select]);
|
||||
//Serial.print("valeur pulse : ");
|
||||
//Serial.println(pulse);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Fonction server.addCallback("/corbac/gd1", &gd1);
|
||||
//definir numero de servo osc_value[N° SERVO] pour get 1st argument(int32)
|
||||
|
||||
void gd1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 0;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 1;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 10;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 11;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 16;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 17;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 26;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void gd8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 27;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void c1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 4;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 5;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c3(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 6;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c4(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 7;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c5(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 12;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c6(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 13;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c7(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 14;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c8(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 15;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c9(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 20;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c10(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 21;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c11(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 22;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c12(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 23;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c13(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 28;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c14(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 29;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c15(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 30;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void c16(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 31;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
|
||||
|
||||
void sheep(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 32;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void badger(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 33;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow1(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 34;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
void cow2(OSCMessage &msg, int addrOffset ) {
|
||||
servo_select = 35;
|
||||
osc_value[servo_select] = int(msg.getFloat(0) * 1000);
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
#define MIN0 230
|
||||
#define MAX0 530
|
||||
#define BOOT0 0
|
||||
#define MIN1 230
|
||||
#define MAX1 530
|
||||
#define BOOT1 0
|
||||
#define MIN2 0
|
||||
#define MAX2 0
|
||||
#define BOOT2 0
|
||||
#define MIN3 0
|
||||
#define MAX3 0
|
||||
#define BOOT3 0
|
||||
#define MIN4 120
|
||||
#define MAX4 350
|
||||
#define BOOT4 -90
|
||||
#define MIN5 145
|
||||
#define MAX5 330
|
||||
#define BOOT5 -90
|
||||
#define MIN6 125
|
||||
#define MAX6 300
|
||||
#define BOOT6 -90
|
||||
#define MIN7 115
|
||||
#define MAX7 300
|
||||
#define BOOT7 -90
|
||||
#define MIN8 0
|
||||
#define MAX8 0
|
||||
#define BOOT8 0
|
||||
#define MIN9 0
|
||||
#define MAX9 0
|
||||
#define BOOT9 0
|
||||
#define MIN10 210
|
||||
#define MAX10 530
|
||||
#define BOOT10 0
|
||||
#define MIN11 220
|
||||
#define MAX11 520
|
||||
#define BOOT11 0
|
||||
#define MIN12 120
|
||||
#define MAX12 300
|
||||
#define BOOT12 -90
|
||||
#define MIN13 120
|
||||
#define MAX13 320
|
||||
#define BOOT13 -90
|
||||
#define MIN14 120
|
||||
#define MAX14 320
|
||||
#define BOOT14 -90
|
||||
#define MIN15 120
|
||||
#define MAX15 320
|
||||
#define BOOT15 -90
|
||||
#define MIN16 220
|
||||
#define MAX16 510
|
||||
#define BOOT16 0
|
||||
#define MIN17 150
|
||||
#define MAX17 460
|
||||
#define BOOT17 0
|
||||
#define MIN18 0
|
||||
#define MAX18 0
|
||||
#define BOOT18 0
|
||||
#define MIN19 0
|
||||
#define MAX19 0
|
||||
#define BOOT19 0
|
||||
#define MIN20 100
|
||||
#define MAX20 260
|
||||
#define BOOT20 -90
|
||||
#define MIN21 100
|
||||
#define MAX21 290
|
||||
#define BOOT21 -90
|
||||
#define MIN22 100
|
||||
#define MAX22 300
|
||||
#define BOOT22 -90
|
||||
#define MIN23 100
|
||||
#define MAX23 250
|
||||
#define BOOT23 -90
|
||||
#define MIN24 0
|
||||
#define MAX24 0
|
||||
#define BOOT24 0
|
||||
#define MIN25 0
|
||||
#define MAX25 0
|
||||
#define BOOT25 0
|
||||
#define MIN26 250
|
||||
#define MAX26 460
|
||||
#define BOOT26 0
|
||||
#define MIN27 210
|
||||
#define MAX27 450
|
||||
#define BOOT27 0
|
||||
#define MIN28 100
|
||||
#define MAX28 240
|
||||
#define BOOT28 -90
|
||||
#define MIN29 100
|
||||
#define MAX29 300
|
||||
#define BOOT29 -90
|
||||
#define MIN30 110
|
||||
#define MAX30 270
|
||||
#define BOOT30 -90
|
||||
#define MIN31 100
|
||||
#define MAX31 250
|
||||
#define BOOT31 -90
|
||||
#define MIN32 100
|
||||
#define MAX32 170
|
||||
#define BOOT32 -90
|
||||
#define MIN33 100
|
||||
#define MAX33 160
|
||||
#define BOOT33 -90
|
||||
#define MIN34 100
|
||||
#define MAX34 190
|
||||
#define BOOT34 0
|
||||
#define MIN35 200
|
||||
#define MAX35 560
|
||||
#define BOOT35 -90
|
||||
#define MIN36 0
|
||||
#define MAX36 0
|
||||
#define BOOT36 0
|
||||
#define MIN37 0
|
||||
#define MAX37 0
|
||||
#define BOOT37 0
|
||||
#define MIN38 0
|
||||
#define MAX38 0
|
||||
#define BOOT38 0
|
||||
#define MIN39 0
|
||||
#define MAX39 0
|
||||
#define BOOT39 0
|
||||
#define MIN40 0
|
||||
#define MAX40 0
|
||||
#define BOOT40 0
|
||||
#define MIN41 0
|
||||
#define MAX41 0
|
||||
#define BOOT41 0
|
||||
#define MIN42 0
|
||||
#define MAX42 0
|
||||
#define BOOT42 0
|
||||
#define MIN43 0
|
||||
#define MAX43 0
|
||||
#define BOOT43 0
|
||||
#define MIN44 0
|
||||
#define MAX44 0
|
||||
#define BOOT44 0
|
||||
#define MIN45 0
|
||||
#define MAX45 0
|
||||
#define BOOT45 0
|
||||
#define MIN46 0
|
||||
#define MAX46 0
|
||||
#define BOOT46 0
|
||||
#define MIN47 0
|
||||
#define MAX47 0
|
||||
#define BOOT47 0
|
||||
#define MIN48 0
|
||||
#define MAX48 0
|
||||
#define BOOT48 0
|
||||
Reference in New Issue
Block a user