Bonjour,
Je fais un bras robotique à 6 degrés de liberté. Je me sers d'une carte Mega 2560 et d'un élément bluetooth HC-05.
Quand je teste l'application de MIT App inventor, le robot ne bouge pas. Je me demande si j'ai un problème de communication avec le bluetooth ou de programmation.
Si quelqu'un pourrait m'aider, ce serait grandement apprécié.
Merci!
code_mit.ino (9.51 KB)
J-M-L
March 21, 2020, 9:56pm
2
avez vous commencé par faire un programme tout simple qui d'un côté envoie une commande et de l'autre imprime ce qui est reçu... tant que ça ne fonctionne pas, pas la peine d'essayer de faire plus...
Non je n'ai pas essayé. Mais, avec le code que j'ai, je suis capable de changer la position du bras en changeant les angles initiaux dans le code.
J-M-L
March 21, 2020, 10:26pm
4
ce n'est pas ça qui va vous dire si la connexion et réception fonctionne bien...
donc commencez par du très simple... validez votre montage et votre programme MIT App Inventor
(l'autre fichier n'est pas lisible sur smartphone)
C'est sûrement une question très basique, mais je connais peu de choses dans ce domaine... Comment je valide le montage et le programme?
C'est un projet d'école et mon enseignement veut que je m'inspire que de ce site : https://howtomechatronics.com/tutorials/arduino/diy-arduino-robot-arm-with-smartphone-control/ .
J-M-L
March 22, 2020, 12:41am
6
J’imagine que le programme Android envoie des commandes sur la voie série
Dans un programme de test, écoutez la voie série sur Arduino (sur Serial1 ou 2 ou 3) et imprimez la commande reçue sur Serial, ça ira sur la console série de votre pc relié à votre Arduino par USB
Oui le programme Android envoie des commandes sur la voie série.
Je ne sais pas si j'ai fait la bonne chose, mais j'ai mis la commande Serial.println() dans le setup du code. Je n'ai pas vu la commande reçue imprimée sur Serial.
J-M-L
March 22, 2020, 1:23am
8
Sur quel port série le BT est il connecté ? Et à quel débit ? C’est dans la loop qu’il faut tester si in reçoit quelque chose, pas juste une fois au boot de la carte
J'utilise le port COM 3.
Le débit est à 9600.
Sur la carte, le TX et RX sont connectés à 0 et 1.
J-M-L
March 22, 2020, 1:48am
10
Il ne faut pas mettre le BT sur 0 et 1 c’est mieux de le réserver au port usb pour parler au moniteur série
Connectez le BT sur Serial1 par exemple, en croisant Tx et Rx plus l’alimentation bine sûr (et en vous assurant que votre module BT supporte le 5V)
Comme ça vous discutez en BT sur Serial1 et affichez sur Serial dans le moniteur série
Ok. J'ai changé le BT de position. Je l'ai mis sur Serial1 et je ne suis toujours pas capable d'afficher quelque chose dans le moniteur série. Peut-être que je n'effectue pas le code correctement et que j'ai fait une erreur...
Le code excède la limite de mots donc je l'ai séparé en 2 messages.
#include <SoftwareSerial.h>
#include <Servo.h>
Servo servo01;
Servo servo02;
Servo servo03;
Servo servo04;
Servo servo05;
Servo servo06;
SoftwareSerial Bluetooth(19, 18); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)
int servo1Pos, servo2Pos, servo3Pos, servo4Pos, servo5Pos, servo6Pos; // current position
int servo1PPos, servo2PPos, servo3PPos, servo4PPos, servo5PPos, servo6PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50], servo05SP[50], servo06SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";
void setup() {
servo01.attach(5);
servo02.attach(6);
servo03.attach(7);
servo04.attach(8);
servo05.attach(9);
servo06.attach(10);
Bluetooth.begin(9600); // Default baud rate of the Bluetooth module
Bluetooth.setTimeout(1);
delay(20);
// Robot arm initial position
servo1PPos = 90;
servo01.write(servo1PPos);
servo2PPos = 90;
servo02.write(servo2PPos);
servo3PPos = 90;
servo03.write(servo3PPos);
servo4PPos = 0;
servo04.write(servo4PPos);
servo5PPos = 90;
servo05.write(servo5PPos);
servo6PPos = 35;
servo06.write(servo6PPos);
}
void loop() {
// Check for incoming data
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString(); // Read the data as string
// If "Waist" slider has changed value - Move Servo 1 to position
if (dataIn.startsWith("s1")) {
String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
servo1Pos = dataInS.toInt(); // Convert the string into integer
// We use for loops so we can control the speed of the servo
// If previous position is bigger then current position
if (servo1PPos > servo1Pos) {
for ( int j = servo1PPos; j >= servo1Pos; j--) { // Run servo down
servo01.write(j);
delay(20); // defines the speed at which the servo rotates
}
}
// If previous position is smaller then current position
if (servo1PPos < servo1Pos) {
for ( int j = servo1PPos; j <= servo1Pos; j++) { // Run servo up
servo01.write(j);
delay(20);
}
}
servo1PPos = servo1Pos; // set current position as previous position
}
// Move Servo 2
if (dataIn.startsWith("s2")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo2Pos = dataInS.toInt();
if (servo2PPos > servo2Pos) {
for ( int j = servo2PPos; j >= servo2Pos; j--) {
servo02.write(j);
delay(50);
}
}
if (servo2PPos < servo2Pos) {
for ( int j = servo2PPos; j <= servo2Pos; j++) {
servo02.write(j);
delay(50);
}
}
servo2PPos = servo2Pos;
}
// Move Servo 3
if (dataIn.startsWith("s3")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo3Pos = dataInS.toInt();
if (servo3PPos > servo3Pos) {
for ( int j = servo3PPos; j >= servo3Pos; j--) {
servo03.write(j);
delay(30);
}
}
if (servo3PPos < servo3Pos) {
for ( int j = servo3PPos; j <= servo3Pos; j++) {
servo03.write(j);
delay(30);
}
}
servo3PPos = servo3Pos;
}
// Move Servo 4
if (dataIn.startsWith("s4")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo4Pos = dataInS.toInt();
if (servo4PPos > servo4Pos) {
for ( int j = servo4PPos; j >= servo4Pos; j--) {
servo04.write(j);
delay(30);
}
}
if (servo4PPos < servo4Pos) {
for ( int j = servo4PPos; j <= servo4Pos; j++) {
servo04.write(j);
delay(30);
}
}
servo4PPos = servo4Pos;
}
// Move Servo 5
if (dataIn.startsWith("s5")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo5Pos = dataInS.toInt();
if (servo5PPos > servo5Pos) {
for ( int j = servo5PPos; j >= servo5Pos; j--) {
servo05.write(j);
delay(30);
}
}
if (servo5PPos < servo5Pos) {
for ( int j = servo5PPos; j <= servo5Pos; j++) {
servo05.write(j);
delay(30);
}
}
servo5PPos = servo5Pos;
}
// Move Servo 6
if (dataIn.startsWith("s6")) {
String dataInS = dataIn.substring(2, dataIn.length());
servo6Pos = dataInS.toInt();
if (servo6PPos > servo6Pos) {
for ( int j = servo6PPos; j >= servo6Pos; j--) {
servo06.write(j);
delay(30);
}
}
if (servo6PPos < servo6Pos) {
for ( int j = servo6PPos; j <= servo6Pos; j++) {
servo06.write(j);
delay(30);
}
}
servo6PPos = servo6Pos;
}
Cette partie est seulement la continuité de l'autre.
// If button "SAVE" is pressed
if (dataIn.startsWith("SAVE")) {
servo01SP[index] = servo1PPos; // save position into the array
servo02SP[index] = servo2PPos;
servo03SP[index] = servo3PPos;
servo04SP[index] = servo4PPos;
servo05SP[index] = servo5PPos;
servo06SP[index] = servo6PPos;
index++; // Increase the array index
}
// If button "RUN" is pressed
if (dataIn.startsWith("RUN")) {
runservo(); // Automatic mode - run the saved steps
}
// If button "RESET" is pressed
if ( dataIn == "RESET") {
memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
memset(servo02SP, 0, sizeof(servo02SP));
memset(servo03SP, 0, sizeof(servo03SP));
memset(servo04SP, 0, sizeof(servo04SP));
memset(servo05SP, 0, sizeof(servo05SP));
memset(servo06SP, 0, sizeof(servo06SP));
index = 0; // Index to 0
}
}
}
// Automatic mode custom function - run the saved steps
void runservo() {
while (dataIn != "RESET") { // Run the steps over and over again until "RESET" button is pressed
for (int i = 0; i <= index - 2; i++) { // Run through all steps(index)
if (Bluetooth.available() > 0) { // Check for incomding data
dataIn = Bluetooth.readString();
if ( dataIn == "PAUSE") { // If button "PAUSE" is pressed
while (dataIn != "RUN") { // Wait until "RUN" is pressed again
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString();
if ( dataIn == "RESET") {
break;
}
}
}
}
// If speed slider is changed
if (dataIn.startsWith("ss")) {
String dataInS = dataIn.substring(2, dataIn.length());
speedDelay = dataInS.toInt(); // Change servo speed (delay time)
}
}
// Servo 1
if (servo01SP[i] == servo01SP[i + 1]) {
}
if (servo01SP[i] > servo01SP[i + 1]) {
for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
servo01.write(j);
delay(speedDelay);
}
}
if (servo01SP[i] < servo01SP[i + 1]) {
for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
servo01.write(j);
delay(speedDelay);
}
}
// Servo 2
if (servo02SP[i] == servo02SP[i + 1]) {
}
if (servo02SP[i] > servo02SP[i + 1]) {
for ( int j = servo02SP[i]; j >= servo02SP[i + 1]; j--) {
servo02.write(j);
delay(speedDelay);
}
}
if (servo02SP[i] < servo02SP[i + 1]) {
for ( int j = servo02SP[i]; j <= servo02SP[i + 1]; j++) {
servo02.write(j);
delay(speedDelay);
}
}
// Servo 3
if (servo03SP[i] == servo03SP[i + 1]) {
}
if (servo03SP[i] > servo03SP[i + 1]) {
for ( int j = servo03SP[i]; j >= servo03SP[i + 1]; j--) {
servo03.write(j);
delay(speedDelay);
}
}
if (servo03SP[i] < servo03SP[i + 1]) {
for ( int j = servo03SP[i]; j <= servo03SP[i + 1]; j++) {
servo03.write(j);
delay(speedDelay);
}
}
// Servo 4
if (servo04SP[i] == servo04SP[i + 1]) {
}
if (servo04SP[i] > servo04SP[i + 1]) {
for ( int j = servo04SP[i]; j >= servo04SP[i + 1]; j--) {
servo04.write(j);
delay(speedDelay);
}
}
if (servo04SP[i] < servo04SP[i + 1]) {
for ( int j = servo04SP[i]; j <= servo04SP[i + 1]; j++) {
servo04.write(j);
delay(speedDelay);
}
}
// Servo 5
if (servo05SP[i] == servo05SP[i + 1]) {
}
if (servo05SP[i] > servo05SP[i + 1]) {
for ( int j = servo05SP[i]; j >= servo05SP[i + 1]; j--) {
servo05.write(j);
delay(speedDelay);
}
}
if (servo05SP[i] < servo05SP[i + 1]) {
for ( int j = servo05SP[i]; j <= servo05SP[i + 1]; j++) {
servo05.write(j);
delay(speedDelay);
}
}
// Servo 6
if (servo06SP[i] == servo06SP[i + 1]) {
}
if (servo06SP[i] > servo06SP[i + 1]) {
for ( int j = servo06SP[i]; j >= servo06SP[i + 1]; j--) {
servo06.write(j);
delay(speedDelay);
}
}
if (servo06SP[i] < servo06SP[i + 1]) {
for ( int j = servo06SP[i]; j <= servo06SP[i + 1]; j++) {
servo06.write(j);
delay(speedDelay);
Serial.println(Serial1);
}
}
}
}
}
lesept
March 22, 2020, 1:44pm
15
Lu sur la référence arduino, page softwareserial :
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
Donc l'utilisation des pins 18 & 19 sur une Mega ne marchera pas.
SoftwareSerial Bluetooth(19, 18);
J-M-L
March 22, 2020, 3:32pm
16
si je peux me permettre, ce n'est pas ce que je demandais... Je vous disais de faire un petit code tout bête de 10 lignes qui écoute le port Série du BT et imprime ce qu'il reçoit sur le moniteur Série.
tant que ce truc là ne fonctionne pas, ce n'est pas la peine d'aller chercher plus loin...
J'ai changé les pins pour 10 et 11.
J'ai fait un code test plus court et j'ai été capable de lire les données imprimées dans le port série. Merci beaucoup!
Maintenant, j'ai essayé mon application et je suis capable de faire bouger les servomoteurs. Merci beaucoup de votre temps, c'est vraiment apprécié.
J-M-L
March 23, 2020, 4:03am
18
Pourquoi faire du software serial sur 10 et 11 (si j’ai bien compris) alors que vous avez 3 ports Série matériels à disposition ?