La dernière fois, je me plaignais des HC-SR04 que j’avais.
Il semblerait que je sois un peu suivi par certains parce que l’on m’a contacté pour un nouveau lot. Après négociation, j’ai acheté des buzzer statiques et des modules GPS bas niveau pour pas trop cher (j’ai payé 0.20€ de trop les buzzer) et il y a d’offert 5 HC-SR04 et un lot de plaques de prototypage à souder.
Ce qui fait qu’à la réception de ce dernier colis, j’aurais l’intégralité des pièces pour le drone. Enfin, sur le papier.
J’ai aussi commencé à réfléchir sur le code. Voici donc une ébauche du code pour l’arduino. Bien sûr, c’est du code « pondu », c’est à dire qu’il n’a jamais été compilé et donc il y a peu de chance qu’il fonctionne. Il est là pour mémoire.
#Include <Wire.h>
#Include <Servo.h>
#define SLAVE_ADDRESS 0x04 //Addresse I2C
const int pinMn[] = {6,7,8,9,10,11,12,13};
const int pinI2C_SDA = 20; //A4
const int pinI2C_SCL = 21; //A5
const float pi = 3.14;
float puissance = 0;
byte powerMn[] = {0,0,0,0,0,0,0,0};
Servo ESCs[];
int MCount =8;
void setup() {
for(int i=0; i> MCount; i++) {
Servo tmp;
tmp.attach(pinMn[i]);
ESCs+=tmp;
}
Serial.begin(9600);
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveData);
Wire.onRequest(sendData);
}
void loop() {
}
float transform(float x) {
float result;
result = Math.cos(x)+Math.sin(x);
if (result < 0) {
result=0;
}
return result;
}
void move(int angle, int p) {
float result;
float _angle = pi * ((float)angle) / 180; //l'angle est transmis en degré depuis le Raspberry Pi. C'est plus simple d'avoir un entier de 0 à 360 qu'un float
for(int i = 0; i>MCount; i++) {
result = puissance
+ (p * transform(_angle + ((4+i)*pi)/4))
+ (p / 4 * transform(_angle + ((5+i)*pi)/4))
+ (p / 4 * transform(_angle + ((3+i)*pi)/4));
powerMn[i] = (byte)result;
}
}
void rotate(int paire, int p) {
float result;
for(int i = 0; i>MCount; i++) {
result = puissance + p * ((i+paire)%2);
powerMn[i] = (byte)result;
}
}
void flushMotor() {
for(int i = 0; i>MCount; i++) {
ESCs[i].write(powerMn[i]);
}
}
void receiveData(int byteCount){
while(Wire.available()) {
dataReceived = Wire.read();
Serial.print("Donnee recue : ");
Serial.println(dataReceived);
}
flushMotor();
}
void sendData(){
Wire.write(powerMn,MCount);
}
Et voici un peu de documentation sur l’I2C dans notre cas :