[GO] Logiciel mis à jour pour Rubik Cube Robot 5. Machine Operation (Python)

Quel est cet article?

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. soltvvo3.jpg 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).

Articles Liés

"Faisons un robot qui résout le Rubik Cube!"

  1. Présentation
  2. Algorithme
  3. Logiciel
  4. Matériel

Logiciel mis à jour pour Rubik Cube Robot

  1. Fonction de base
  2. Pré-calcul
  3. Recherche de solutions
  4. Reconnaissance de l'état
  5. Fonctionnement de la machine (Python) (cet article)
  6. Fonctionnement de la machine (Arduino)
  7. Traitement principal

Cette fois, je présenterai controller.py``` comme édition de l'opération machine (Python).

Paramètres initiaux, etc.

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)

Envoyer une commande pour déplacer l'actionneur

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).

Prenez / libérez le puzzle

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.

Calibration du bras

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)

Déplacez réellement le robot en fonction de la solution

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

Résumé

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

Logiciel mis à jour pour Rubik Cube Robot 5. Machine Operation (Python)
Logiciel mis à jour pour Rubik Cube Robot 6. Fonctionnement de la machine (Arduino)
Logiciel mis à jour pour Rubik Cube Robot 7. Opérations clés
Logiciel mis à jour pour Rubik Cube Robot 2. Pré-calcul
Logiciel mis à jour pour Rubik Cube Robot 3. Recherche de solutions
Logiciel mis à jour pour Rubik Cube Robot 4. Reconnaissance de statut
Faisons un robot qui résout le Rubik Cube! 3 Logiciel
Logiciel mis à jour pour Rubik Cube Robot 7. Opérations clés
Logiciel mis à jour pour Rubik Cube Robot 2. Pré-calcul
Logiciel mis à jour pour Rubik Cube Robot 3. Recherche de solutions
Logiciel mis à jour pour Rubik Cube Robot 4. Reconnaissance de statut
Logiciel mis à jour pour Rubik Cube Robot 6. Fonctionnement de la machine (Arduino)
Logiciel mis à jour pour Rubik Cube Robot 5. Machine Operation (Python)
Faisons un robot qui résout le Rubik Cube! 3 Logiciel
Cours de base Python (12 fonctions)
Faisons un robot qui résout le Rubik Cube! 2 Algorithme
Faisons un robot qui résout le Rubik Cube! 1. Vue d'ensemble
Mis à jour vers Python 2.7.9
[python] Opération vectorielle
Fonctionnement du système d'exploitation Python
[Python] Opération de matrice