Je développe actuellement un robot qui résout un cube rubic 2x2x2. Ceci est une collection d'articles de commentaires sur le programme du robot. J'ai écrit une fois une collection d'articles représentés par l'article ici, mais depuis cette fois, le logiciel a été considérablement mis à jour, je vais donc introduire un nouveau programme. pense.
Le code applicable est disponible ici [https://github.com/Nyanyan/soltvvo/tree/master/Soltvvo3.2).
"Faisons un robot qui résout le Rubik Cube!"
Logiciel mis à jour pour Rubik Cube Robot
Cette fois, je présenterai
controller.py``` comme édition de l'opération machine (Python).
Tout d'abord, configurez la communication série et GPIO.
ser_motor = [None, None]
GPIO.setmode(GPIO.BCM)
GPIO.setup(21,GPIO.IN)
ser_motor[0] = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.01, write_timeout=0)
ser_motor[1] = serial.Serial('/dev/ttyUSB1', 115200, timeout=0.01, write_timeout=0)
Un actionneur ici est un moteur. Le moteur est connecté à une machine compatible Arduino auto-fabriquée et l'actionneur est actionné en envoyant une commande à Arduino. Ici, nous allons introduire une fonction qui envoie des commandes.
'''Envoyer une commande pour déplacer l'actionneur'''
''' Send commands to move actuators '''
def move_actuator(num, arg1, arg2, arg3=None):
if arg3 == None:
com = str(arg1) + ' ' + str(arg2)
else:
com = str(arg1) + ' ' + str(arg2) + ' ' + str(arg3)
ser_motor[num].write((com + '\n').encode())
Il existe deux types de commandes pour déplacer l'actionneur, qui diffèrent par le nombre d'arguments. Donc j'écris une instruction if
en utilisant arg3 == None
(bien que je parle de séparer les fonctions).
En utilisant la fonction précédente, j'ai créé une fonction pour saisir le puzzle et une fonction pour le libérer. C'est une fonction pour des actions occasionnelles.
'''Prenez le cube'''
''' Grab arms '''
def grab_p():
for i in range(2):
for j in range(2):
move_actuator(j, i, 1000)
sleep(3)
'''Libérez le cube'''
''' Release arms '''
def release_p():
for i in range(2):
for j in range(2):
move_actuator(i, j, 2000)
Pour deux Arduino i
, exécutez les deux moteurs `` j``` connectés à chacun.
1000 et 2000 signifient que si vous envoyez 1000, vous saisirez le puzzle, et si vous en envoyez 2000, vous le relâchez.
Le bras étant entraîné par un moteur pas à pas, il est nécessaire d'ajuster la position de manière appropriée. L'Arduino a un capteur à effet Hall (capteur magnétique) et le bras a un aimant. En utilisant cela, la position sera ajustée automatiquement. Depuis Python, vous pouvez ajuster la position simplement en envoyant une commande.
'''Calibration du bras'''
''' Calibration arms '''
def calibration():
release_p()
sleep(0.1)
for i in range(2):
for j in range(2):
move_actuator(j, i, 0, 500)
C'est une fonction qui déplace le robot lorsque vous entrez une solution et d'autres constantes.
Le robot dispose d'un bouton d'arrêt d'urgence, qui est traité en premier. À propos, le bouton d'arrêt d'urgence est un pull-up, donc même si le connecteur est déconnecté, l'opération s'arrêtera.
Et lorsque vous tournez autre que le premier mouvement, changez le puzzle, faites tourner le moteur dans l'ordre et reposez-vous pendant un temps proportionnel au nombre maximum de rotations. Renvoie le temps qu'il a fallu pour finalement résoudre.
'''En fait, déplacez le robot'''
''' Control robot '''
def controller(slp1, slp2, rpm, ratio, solution):
strt_solv = time()
for i, twist in enumerate(solution):
#Appuyez sur le bouton d'arrêt d'urgence pour arrêter
if GPIO.input(21) == GPIO.LOW:
if bluetoothmode:
client_socket.send('emergency\n')
solvingtimevar.set('emergency stop')
print('emergency stop')
return
#Changer les puzzles
if i != 0:
grab = twist[0][0] % 2
for j in range(2):
move_actuator(j, grab, 1000)
sleep(slp1)
for j in range(2):
move_actuator(j, (grab + 1) % 2, 2000)
sleep(slp2)
max_turn = 0
for each_twist in twist:
move_actuator(each_twist[0] // 2, each_twist[0] % 2, each_twist[1] * 90, rpm)
max_turn = max(max_turn, abs(each_twist[1]))
#Attendez que le puzzle tourne
slptim = 2 * 60 / rpm * max_turn * 90 / 360 * ratio
sleep(slptim)
solv_time = str(int((time() - strt_solv) * 1000) / 1000).ljust(5, '0')
return solv_time
Cette fois, j'ai expliqué la fonction qui déplace réellement le robot (bien que ce que je fais soit d'envoyer des commandes). Ensuite, j'expliquerai comment le moteur fonctionne après avoir reçu la commande côté Arduino.
Recommended Posts