Ich entwickle gerade einen Roboter, der einen 2x2x2 Rubikwürfel löst. Dies ist eine Sammlung von Kommentaren zum Roboterprogramm. Ich habe einmal eine Sammlung von Artikeln geschrieben, die durch den Artikel [hier] repräsentiert werden (https://qiita.com/Nyanyan_Cube/items/60f3699db96dba4a4bf5), aber seitdem wurde die Software erheblich aktualisiert, sodass ich ein neues Programm einführen werde. Überlegen.
Der entsprechende Code ist hier verfügbar [https://github.com/Nyanyan/soltvvo/tree/master/Soltvvo3.2].
"Lass uns einen Roboter bauen, der den Zauberwürfel löst!"
Aktualisierte Software für Rubik Cube Robot
Dieses Mal werde ich `` `controller.py``` als Python-Edition (Machine Operation) einführen.
Richten Sie zunächst die serielle Kommunikation und GPIO ein.
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)
Ein Aktuator ist hier ein Motor. Der Motor ist mit einer selbst hergestellten Arduino-kompatiblen Maschine verbunden, und der Aktuator wird durch Senden eines Befehls an Arduino betätigt. Hier stellen wir eine Funktion vor, die Befehle sendet.
'''Senden Sie einen Befehl zum Bewegen des Stellantriebs'''
''' 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())
Es gibt zwei Arten von Befehlen zum Bewegen des Aktuators, die sich in der Anzahl der Argumente unterscheiden. Also schrieb ich eine `if``` Anweisung mit`
arg3 == None``` (obwohl es eine Geschichte ist, dass die Funktionen getrennt werden sollten).
Mit der vorherigen Funktion habe ich eine Funktion zum Greifen des Puzzles und eine Funktion zum Lösen des Puzzles erstellt. Dies ist eine Funktion für gelegentliche Aktionen.
'''Nimm den Würfel'''
''' Grab arms '''
def grab_p():
for i in range(2):
for j in range(2):
move_actuator(j, i, 1000)
sleep(3)
'''Lassen Sie den Würfel los'''
''' Release arms '''
def release_p():
for i in range(2):
for j in range(2):
move_actuator(i, j, 2000)
Lassen Sie für zwei Arduino `` i``` die beiden Motoren
`j``` laufen, die jeweils miteinander verbunden sind.
1000 und 2000 bedeutet, dass Sie das Puzzle greifen, wenn Sie 1000 senden, und wenn Sie 2000 senden, werden Sie es freigeben.
Da der Arm von einem Schrittmotor angetrieben wird, muss die Position entsprechend eingestellt werden. Der Arduino hat einen Hallsensor (Magnetsensor) und der Arm hat einen Magneten. Auf diese Weise wird die Position automatisch angepasst. In Python können Sie die Position anpassen, indem Sie einen Befehl senden.
'''Armkalibrierung'''
''' 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)
Diese Funktion bewegt den Roboter, wenn Sie eine Lösung und andere Konstanten eingeben.
Der Roboter verfügt über einen Not-Aus-Taster, der zuerst verarbeitet wird. Übrigens ist der Not-Aus-Schalter ein Klimmzug. Selbst wenn der Stecker abgezogen wird, wird der Betrieb gestoppt.
Und wenn Sie eine andere als die erste Bewegung drehen, ändern Sie das Puzzle, drehen Sie den Motor nacheinander und ruhen Sie sich eine Zeit aus, die proportional zur maximalen Anzahl von Umdrehungen ist. Gibt die Zeit zurück, die zum endgültigen Lösen benötigt wurde.
'''Bewegen Sie den Roboter tatsächlich'''
''' Control robot '''
def controller(slp1, slp2, rpm, ratio, solution):
strt_solv = time()
for i, twist in enumerate(solution):
#Drücken Sie die Not-Aus-Taste, um anzuhalten
if GPIO.input(21) == GPIO.LOW:
if bluetoothmode:
client_socket.send('emergency\n')
solvingtimevar.set('emergency stop')
print('emergency stop')
return
#Rätsel wechseln
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]))
#Warten Sie, bis sich das Puzzle dreht
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
Dieses Mal erklärte ich die Funktion, die den Roboter tatsächlich bewegt (obwohl ich nur Befehle sende). Als nächstes werde ich erklären, wie der Motor betrieben wird, nachdem der Befehl auf der Arduino-Seite empfangen wurde.
Recommended Posts