Comme fonctionnalité supplémentaire, nous voulons maintenant que notre petit robot suive le son de notre voix. Si le mode est activé, le robot doit naviguer automatiquement dans la direction à partir de laquelle l’appel a été effectué.
Il existe également de petits capteurs de détection de son analogiques, qui sont lus via un convertisseur ADC MCP3008, puis le robot Raspberry Pi oriente en conséquence dans cette direction.
Comme avec la plupart des tutoriels précédents sur le robot Raspberry Pi, vous pouvez les ignorer ou les adapter si vous souhaitez que votre robot ait des fonctionnalités différentes.
Pièces matérielles requises
Si vous souhaitez recréer ce didacticiel, vous aurez besoin des composants suivants:
Sinon, la colle chaude continue de faciliter l’assemblage.
Construction et câblage
Tout d’abord, nous connectons les capteurs. Pour ce faire, trois câbles volants doivent être connectés par capteur. Si vos capteurs ont 4 broches, il vous suffit de connecter VCC, GND et A0. Désormais, les modules peuvent être simplement collés au corps. Avant de le réparer définitivement (avec de la colle chaude ou similaire), vous devez d’abord trouver la meilleure position (plus à ce sujet plus tard). J’ai branché un capteur à l’avant, ainsi qu’un à droite et un à gauche. Autres détecteurs de son, p.ex. à fixer à l’arrière ou à 45 °.
Le prochain est le MCP3008. La communication a lieu via SPI, nous obtenons uniquement la tension de 3,3 V d’une autre broche libre:
Raspberry Pi | MCP3008 |
---|---|
Broche 17 (3,3 V) | Broche 16 (VDD) |
Broche 17 (3,3 V) | Broche 15 (VREF) |
Broche 25 (GND) | Broche 14 (AGND) |
Broche 23 (SCLK) | Broche 13 (CLK) |
Broche 21 (MISO) | Broche 12 (DOUT) |
Broche 19 (MOSI) | Broche 11 (DIN) |
Broche 24 (CE0) | Broche 10 (CS / SHDN) |
Broche 25 (GND) | Broche 9 (DGND) |
De l’autre côté se trouvent les 8 canaux auxquels des capteurs analogiques (données ou broche A0) peuvent être connectés. Nous connectons le capteur avant à CH0, le capteur droit à CH1 et le gauche à CH2. La broche VCC des trois modules est également connectée à 3,3 V et GND à une connexion GND du Raspberry Pi.
La structure (y compris nos modules connectés précédents) ressemble à ceci:
Convertisseur ADC MCP3008
Le Raspberry Pi ne peut pas facilement lire les valeurs analogiques. Par conséquent, un ADC comme le MCP3008 est nécessaire. Dans un tutoriel précédent, j’ai décrit le fonctionnement d’un ADC, y compris les installations nécessaires. Si un convertisseur analogique-numérique n’a jamais été utilisé, nous vous recommandons de lire ce tutoriel. Sinon, vous pouvez simplement continuer ici.
Nous créons donc un nouveau fichier dans le dossier avec nos autres fichiers Python Robot, qui contient une classe pour le convertisseur analogique-numérique:
sudo nano MCP3008.py
1 2 3 4 5 6 sept 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 |
de Spidev importer SpiDev classe MCP3008: def __init__(soi, autobus = 0, dispositif = 0): soi.autobus, soi.dispositif = autobus, dispositif soi.spi = SpiDev() soi.ouvert() soi.spi.max_speed_hz = 1000000 # 1MHz def ouvert(soi): soi.spi.ouvert(soi.autobus, soi.dispositif) soi.spi.max_speed_hz = 1000000 # 1MHz
def lis(soi, canal = 0): adc = soi.spi.xfer2([1, (8 + channel) << 4, 0]) Les données = ((adc[1] & 3) << 8) + adc[2] revenir Les données
def proche(soi): soi.spi.proche() |
Il ne vous reste plus qu’à enregistrer (CTRL + O) et à quitter l’éditeur (CTRL + X).
Élargir le code
Dans notre robot.py
fichier, nous importons d’abord le fichier créé:
de MCP3008 importer MCP3008 |
À la fin du cours, une autre fonction doit également être créée, qui peut être utilisée pour répondre à la reconnaissance vocale. Ajoutons donc le code suivant:
1 2 3 4 5 6 sept 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def followVoice(soi): adc = MCP3008() tandis que Vrai: de face = adc.lis(0) droite = adc.lis(1) la gauche = adc.lis(2) # les valeurs minuscules ne sont pas valides => mappez-les à 1023 si de face < dix: de face = 1023; # les moteurs font un bruit d’environ 150, si le moteur tourne si droite < 50: droite = 1023; si la gauche < 50: la gauche = 1023; si de face < 1000 et droite > 1000 et la gauche > 1000: soi.moteur.avantDroite() elif de face > 1000 et droite < 1000 et la gauche > 1000: soi.moteur.avantGauche() elif de face > 1000 et droite > 1000 et la gauche < 1000: soi.moteur.avantDroite() elif de face < 1000 et droite < 1000 et la gauche > 1000: # avant / droite soi.moteur.avantGauche() temps.sommeil(soi.moteur.SEC_PER_TURN / 360,0 * 45) elif de face < 1000 et droite > 1000 et la gauche < 1000: # avant gauche soi.moteur.avantDroite() temps.sommeil(soi.moteur.SEC_PER_TURN / 360,0 * 45) autre: soi.moteur.Arrêtez() temps.sommeil(0,1) |
Vous pouvez expérimenter avec les valeurs de seuil (le volume auquel la réaction se produit). Comme les moteurs sont assez bruyants, j’ai réglé le seuil des microphones latéraux plus haut. Dès que vous avez trouvé une bonne position (ou ajustez les valeurs de seuil en conséquence), les détecteurs de son peuvent également être fixés au corps.
Si le fichier est développé en conséquence, nous pouvons exécuter un petit test. Pour ce faire, nous ouvrons la console Python (sudo python
) et entrez le code suivant:
de robot importer Robot importer temps essayer: r=Robot() r.followVoice() sauf Exception comme e: impression(e) enfin: r.moteur.Arrêtez() |
Malheureusement, les capteurs de bruit ne sont pas trop précis, c’est pourquoi suivre la voix ne fonctionne pas toujours de manière optimale – en tant que gadget, c’est certainement une bonne chose.
Avec l’aide de la commande infrarouge, que nous avons créée auparavant, nous pouvons par exemple spécifier un bouton qui active le mode de suivi vocal.
Avec un vrai microphone, vous pourriez même faire en sorte que le robot Raspberry Pi réponde aux commandes vocales. Seuls certains mots de code devraient être réagis (avant, droite, gauche, arrêt, etc.) et les actions correspondantes appelées.
Dans la partie suivante, nous laissons le robot être contrôlé à distance via le contrôleur / joystick Xbox 360.