Étape 17 : Logiciel de Test de charge
Maintenant, il faut programmer l’Edison pour contrôler le robot. Je vais vous donner un code de test simple dans cette étape conçue pour vérifier que tout le matériel fonctionne et pour vous permettre de s’assurer que l’encodeur correcte est associé avec les bons canaux de moteurs, mais laissera plus complexe programmation à vous (et pour des missions plus tard...).
Je vais utiliser Node.js pour le rendre plus facile pour se connecter aux services web et d’autres plus tard, mais il est également possible d’utiliser le C/C++, Python, Arduino ou Java si vous voulez. Je vais également utiliser MRAA et UPM, certaines bibliothèques d’interface simple matériel fournis par Intel. Il y a d’autres options de l’interface HW Node.js il trop, comme cylon.js et JohnnyFive, que vous pourriez vouloir regarder plus tard.
Cependant, nous allons configurer choses pour utiliser MRAA et UPM. Tout d’abord, suivez les instructions pour mettre à jour MRAA et UPM pour les dernières versions. Vous pouvez trouver la documentation pour cela sur le site d’Intel mais si vous avez déjà mis à jour le firmware de Edison pour une version assez récente alors ce qui suit devrait saisir les dernières versions depuis le repos en ligne (note : Edison devront avoir accès à internet tout d’abord...). Après la notation dans l’Edison en tant que root, exécutez les commandes suivantes :
opkg mise à jour
opkg mise à niveau libmraa0
opkg mise à niveau upm
Alors, vous voulez mettre le script suivant quelque part sur l’Edison et puis exécutez-le à l’aide de « nœud omnitest.js » dit dans « omnitest.js » dans votre répertoire home. Alternativement, vous pouvez charger ce code à l’aide de la libre XDK Intel (IoT Edition), qui rend le cycle edit/upload/exécuter plus commode, prévoit un débogueur si vous le souhaitez et gère également la résolution NGP module dépendances (Cependant, ce script de test évite intentionnellement à l’aide de modules externes autres que l’UPM et MRAA pour rendre l’installation plus facile). Chargement de code par le XDK configure également il s’exécute automatiquement au démarrage. Je vais montrer comment utiliser qui plus en détail plus tard.
Ce script permet de s’assurer que les codeurs, capteurs, moteurs et les haut-parleurs sont tout le fonctionnement. Fondamentalement, le script tourne le robot en arrière au lieu de courir tous les moteurs en avant, puis vers l’arrière, puis il exécute chaque moteur à son tour. Assurez-vous que tous les trois encodeurs comptent vers le haut et puis vers le bas en avant et en arrière, le premier mouvement. Vérifiez ensuite que lorsque chaque moteur tourne à son tour que le canal de l’encodeur correct ne répond pas. Si non, d’échanger autour des câbles de codeur ou de modifier l’affectation des broches dans le script. Si un des moteurs ne tourne pas vous pouvez avoir inversé les ID pour les deux chauffeurs. Je recommande de changer l’affectation des broches du script, plutôt que de jouer avec le câblage. Vous pouvez également ajuster les constantes mise à l’échelle pour le diviseur de tension (si vous l’utilisez) pour obtenir une lecture plus précise. Regardez fondamentalement la lecture brute, Regardez le vérificateur de tension externe et puis entrez les constantes de droite dans le script pour calculer le rapport de mise à l’échelle.
Une fois ce script de test est en cours d’exécution et de ce qui précède est tout trié, le matériel devrait être prêt pour un codage plus sophistiqué !
------
/ * Omnirover démo.
* Exercices moteurs, lit les données provenant de capteurs et qu’elle déverse sur la console, essais sonores.
*/
/ === TEST SÉLECTION
var test_motors = true ;
var test_batt = true ;
var test_encoders = true ;
var test_sound = true ;
=== DÉPENDANCES
var Mraa = require('mraa') ; général I/O HW
var MD = require("jsupm_grovemd"). GroveMD ; Moteur de UPM Grove
var RE = require("jsupm_rotaryencoder"). RotaryEncoder ; Encodeur rotatif de l’UPM
=== CONFIGURATION
pins var = {}
Batterie connectée par le biais de diviseur de tension Grove, sur 3 réglage
Batt: 1, / / analogique d’entrée ; niveau de batterie totale, divisé par 3.
Module de « speaker » Grove (peut également utiliser le module vibreur)
haut-parleur: 6, / / peut être utilisé pour produire des tons différents à l’aide de modulation PWM
Encodeurs en quadrature pour chaque roue (swap autour au besoin pour obtenir des encodeurs corrects sur roues corrects)
encoder_A1: 2, / / 1, une entrée de roue
encoder_B1: 3, / / 1, B entrée de roue
encoder_A2: 8, / / 2, une entrée de roue
encoder_B2: 9, / / 2, B entrée de roue
encoder_A3: 4, / / 3, une entrée de roue
encoder_B3: 5, / / 3, B entrée de roue
Pilotes de moteurs
motor_driver_bus: 0, / / Bus (matériel I2C)
motor_driver_01_id : 15, / / I2C adresse pour moteurs de 0 et 1 (canal 0 n’est pas utilisé)
motor_driver_23_id : 10 / / I2C adresse pour moteurs 2 et 3
};
Console.log("pins:",pins) ;
=== MOTEUR TEST
var motor01 = new MD(pins.motor_driver_bus,pins.motor_driver_01_id) ;
var motor23 = new MD(pins.motor_driver_bus,pins.motor_driver_23_id) ;
Fonction d’assistance pour définir les orientations et les vitesses du moteur plus facilement
function set_speed(m0,m1,m2,m3) {}
var abs_m0 = Math.floor(255*Math.abs(m0)) ;
var abs_m1 = Math.floor(255*Math.abs(m1)) ;
var abs_m2 = Math.floor(255*Math.abs(m2)) ;
var abs_m3 = Math.floor(255*Math.abs(m3)) ;
var dir_m0 = (m0 > 0) ? MD. DIR_CW : MD. DIR_CCW ;
var dir_m1 = (m1 > 0) ? MD. DIR_CW : MD. DIR_CCW ;
var dir_m2 = (m2 > 0) ? MD. DIR_CW : MD. DIR_CCW ;
var dir_m3 = (m3 > 0) ? MD. DIR_CW : MD. DIR_CCW ;
motor01.setMotorSpeeds(0,0) ;
motor01.setMotorDirections(dir_m0,dir_m1) ;
motor01.setMotorSpeeds(abs_m0,abs_m1) ;
motor23.setMotorSpeeds(0,0) ;
motor23.setMotorDirections(dir_m2,dir_m3) ;
motor23.setMotorSpeeds(abs_m2,abs_m3) ;
}
Test moteur
Si {(test_motors)
periodicMotorForward() ;
} else {}
set_speed(0,0,0,0) ;
}
function periodicMotorForward() {}
Console.log ("moteurs : tous vers l’avant") ;
set_speed(0,1,1,1) ;
setTimeout(periodicMotorStop1,10000) ;
}
function periodicMotorStop1() {}
Console.log ("moteurs : arrêt") ;
set_speed(0,0,0,0) ;
setTimeout(periodicMotorBackward,3000) ;
}
function periodicMotorBackward() {}
Console.log ("MOTORS : vers l’arrière") ;
set_speed(0,-1,-1,-1) ;
setTimeout(periodicMotorStop2,10000) ;
}
function periodicMotorStop2() {}
Console.log ("moteurs : arrêt") ;
set_speed(0,0,0,0) ;
setTimeout(periodicMotorForward_1,3000) ;
}
Utiliser les trois fonctions suivantes, en conjonction avec le test de l’encodeur,
pour vous assurer que les encodeurs sont associés avec les moteurs corrects
function periodicMotorForward_1() {}
Console.log ("moteurs : moteur avant 1") ;
set_speed(0,1,0,0) ;
setTimeout(periodicMotorForward_2,10000) ;
}
function periodicMotorForward_2() {}
Console.log ("moteurs : moteur avant 2") ;
set_speed(0,0,1,0) ;
setTimeout(periodicMotorForward_3,10000) ;
}
function periodicMotorForward_3() {}
Console.log ("moteurs : moteur avant 3") ;
set_speed(0,0,0,1) ;
setTimeout(periodicMotorForward,10000) ;
}
=== TEST DE L’ENCODEUR
Lit tous les encodeurs périodiquement et les imprime sur leur compte courant
Si {(test_encoders)
var encoder1 = new RE(pins.encoder_A1,pins.encoder_B1) ;
var encoder2 = new RE(pins.encoder_A2,pins.encoder_B2) ;
var encoder3 = new RE(pins.encoder_A3,pins.encoder_B3) ;
{setInterval(function()}
Console.log ("encoder1:", encoder1.position()) ;
Console.log ("encoder2:", encoder2.position()) ;
Console.log ("encoder3:", encoder3.position()) ;
}, 1000) ;
}
=== TEST DE DÉTECTEUR DE BATTERIE
batt var = new Mraa.Aio(pins.batt) ;
var batt_scale = 11.93/0.8 ; Diviseur de tension, 3 réglage
function read_batt_sensor() {}
var br = batt.readFloat() ;
var bv = batt_scale * br ;
Console.log ("lecture brute batt: », br) ;
Console.log("BATT:",BV) ;
}
Si {(test_batt)
setInterval(read_batt_sensor,1000) ;
}
=== TEST SONORE
haut-parleur de var = new Mraa.Pwm(pins.speaker) ;
var speaker_duty = 0,5 ;
var speaker_freq = 600 ;
var speaker_on_interval = 1000 ;
var speaker_off_interval = 10000 ;
Si {(test_sound)
Speaker.period(1.0/speaker_freq) ;
Speaker.Write(0.0) ;
Speaker.Enable(true) ;
start_alarm() ;
} else {}
Speaker.Enable(false) ;
}
function start_alarm() {}
Console.log ("alarme sur") ;
Speaker.period(1.0/speaker_freq) ;
Speaker.Write(speaker_duty) ;
setTimeout(stop_alarm,speaker_on_interval) ;
}
function stop_alarm() {}
Console.log ("alarm off") ;
Speaker.Write(1.0) ;
setTimeout(start_alarm,speaker_off_interval) ;
}