Mine is fully printed in black PLA, took the Raspberry with motors and distance-sensor of my earlier 'mouse-wheel'-Robot.
Used the LED openings for 'normal' yellow left-right and white front and red back lights (although programming must be done yet).
There will be some 3D-Printer video's of the build process and also some running robot video's.
Current code:
Code: Select all
print()
print("= = = = = = = = = = = = = =")
print(" DG - DC motor & tank test ")
print("= = = = = = = = = = = = = =")
print(" motor1 = rechter motor")
print(" motor2 = linker motor, gezien vanaf voertuig zelf")
print("-- (c) 2024 --")
# mouse_front_wheel.py heeft (gedeeltelijke) muis-besturing.
# https://www.orangecoat.com/how-to/read-and-decode-data-from-your-mouse-using-this-pyusb-hack
#
# Mouse click 1 werkte niet. Andere schakelaar gesoldeerd, werkt nu wel.
# Linkermuisknop vervangen (waarschijnlijk [1, 0, 0, 0]) en als voorbumper gebruikt.
#
# /etc/udev/rules.d/90-dg.rules aangemaakt zodat we Thonny kunnen blijven gebruiken
# hierin wordt gebruiker: pi als main-user gebruikt voor deze USB muis.
#
# Auto rijdt nu, maar wat slipperig.
# als voor-bumper iets raakt, dan 1 sec achteruit en 3 sec links achteruit om het
# voertuig te draaien, maar dat lukt niet altijd even goed, ook niet met 2 motors
# tegengesteld draaiend.
#
# Pin 40 en 31 omwisselen ivm draaien van 1 motor tijdens opstarten van de Pi.
# Dat werkt.
#
# Volgende deel is ultra-sone afstand meten?
# Werkt op afstand, auto stopt als de afstand kleiner dan 14cm is, net voordat de
# voorbumper wordt geraakt, als het goed is.
#
# Pin 40 en 31 omwisselen ivm draaien van 1 motor tijdens opstarten van de Pi.
# Dat werkt.
#
# motors op 70% PWM als afstand < 40cm
# Tussen 100cm en 25cm, 100% tot 70%
# --
# Afvangen van de bits voor knoppen besturing, niet op string!
#
# De inwendige muis-camera-beeld opvangen?
# file:///home/pi/Documents/DSA00519212.pdf
#
# muis-rol-knop als front-zwenk-wiel?
#
# DG - INIT
#!/usr/bin/python
#import sys
#import usb.core
#import usb.util
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
# init motors
Motor1A = 35 # GPIO19
Motor1B = 37 # GPIO26
Motor1E = 31 # GPIO6
Motor2A = 33 # GPIO13
Motor2B = 40 # GPIO21
Motor2E = 29 # GPIO5
GPIO.setup(Motor1A,GPIO.OUT)
GPIO.setup(Motor1B,GPIO.OUT)
GPIO.setup(Motor1E,GPIO.OUT)
pwm1=GPIO.PWM(31,100)
pwm1.start(100)
GPIO.setup(Motor2A,GPIO.OUT)
GPIO.setup(Motor2B,GPIO.OUT)
GPIO.setup(Motor2E,GPIO.OUT)
pwm2=GPIO.PWM(29,100)
pwm2.start(100)
# init ultrasone distance sensor hc-sr04
GPIO_TRIGGER = 36 # GPIO16
GPIO_ECHO = 38 # GPIO20
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
# init specific USB mouse
#data = None
#collected = 0
#attempts = 1
# decimal vendor and product values
#ID1 = 0x46d
#ID2 = 0xc00e
# dev = usb.core.find(idVendor=1118, idProduct=1917)
# or, uncomment the next line to search instead by the hexidecimal equivalent
#dev = usb.core.find(idVendor=ID1, idProduct=ID2)
#if dev is None:
# print("De juiste USB muis (046d:c00e) is niet gevonden...")
# attempts = 0
#else:
# first endpoint
# interface = 0
# endpoint = dev[0][(0,0)][0]
# if the OS kernel already claimed the device, which is most likely true
# thanks to http://stackoverflow.com/questions/8218683/pyusb-cannot-set-configuration
# if dev.is_kernel_driver_active(interface) is True:
# tell the kernel to detach
# print("'USB muis' (046d:c00e) loskoppelen van kernel (OS)")
# dev.detach_kernel_driver(interface)
# claim the device
# print("'USB muis' aan dit programma koppelen.")
# usb.util.claim_interface(dev, interface)
#print()
# DG - sub routines
def distance():
# set Trigger to HIGH
GPIO.output(GPIO_TRIGGER, True)
# set Trigger after 0.01ms to LOW
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
StartTime = time.time()
StopTime = time.time()
# save StartTime
while GPIO.input(GPIO_ECHO) == 0:
StartTime = time.time()
# save time of arrival
while GPIO.input(GPIO_ECHO) == 1:
StopTime = time.time()
# time difference between start and arrival
TimeElapsed = StopTime - StartTime
# multiply with the sonic speed (34300 cm/s)
# and divide by 2, because there and back
afstand = (TimeElapsed * 34300) / 2
return afstand
# DG - PROGRAM
# string1 bevat het data-deel voor linkermuisknop
# array('B', [0, 0, 0, 0]) = waarde na willekeurige knop loslaten (nul-waarde)
# array('B', [1, 0, 0, 0]) = linkermuisknop (bit1)
# array('B', [2, 0, 0, 0]) = rechtermuisknop (bit2)
# array('B', [4, 0, 0, 0]) = wielknop (bit3)
# array('B', [0, 0, 0, 1]) = wiel vooruit (hoger=sneller)
# array('B', [0, 0, 0, 255]) = wiel achteruit (lager=sneller)
# array('B', [0, X, Y, 0]) = muis positiebeweging X, Y (1, 255 x 1, 255)
string1 = "array('B', [1, "
string2 = "array('B', [2, "
while True:
dist = distance()
print("Afstand is: %.2f cm" % dist)
if (dist > 100) :
pwm1.ChangeDutyCycle(100)
pwm2.ChangeDutyCycle(100)
if (dist < 100) :
if (dist < 75) :
pwm1.ChangeDutyCycle(80)
pwm2.ChangeDutyCycle(80)
if (dist < 50) :
pwm1.ChangeDutyCycle(60)
pwm2.ChangeDutyCycle(60)
if dist < 25 :
pwm1.ChangeDutyCycle(40)
pwm2.ChangeDutyCycle(40)
# if (string1 in str(data)) :
# print("Voorbumper geraakt, afstands-sensor zegt: %.2f cm" % dist, data)
# GPIO.output(Motor1E,GPIO.LOW)
# GPIO.output(Motor2E,GPIO.LOW)
# dist = -1
if (dist < 14) :
if (dist > 0): print("Afstand kleiner dan 14cm, nl. %.2f cm" % dist)
pwm1.ChangeDutyCycle(100)
pwm2.ChangeDutyCycle(100)
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor2E,GPIO.LOW)
# time.sleep(1)
# beide motoren achteruit, 1 sec
GPIO.output(Motor1A,GPIO.HIGH)
GPIO.output(Motor1B,GPIO.LOW)
GPIO.output(Motor1E,GPIO.HIGH)
GPIO.output(Motor2A,GPIO.HIGH)
GPIO.output(Motor2B,GPIO.LOW)
GPIO.output(Motor2E,GPIO.HIGH)
time.sleep(1)
# motor links 2 sec achteruit rechts vooruit
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
# GPIO.output(Motor1E,GPIO.LOW)
time.sleep(1)
# motors weer vooruit ... maar uit / off
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor2A,GPIO.LOW)
GPIO.output(Motor2B,GPIO.HIGH)
GPIO.output(Motor2E,GPIO.LOW)
time.sleep(1)
else:
# print("Rechter motor vooruit")
GPIO.output(Motor1A,GPIO.LOW)
GPIO.output(Motor1B,GPIO.HIGH)
GPIO.output(Motor1E,GPIO.HIGH)
# print("Linker motor vooruit")
GPIO.output(Motor2A,GPIO.LOW)
GPIO.output(Motor2B,GPIO.HIGH)
GPIO.output(Motor2E,GPIO.HIGH)
# if (string2 in str(data)) :
# print()
# print("Noodstop knop ?")
# collected += 1
# print ("Measured Distance = %.2f cm" % dist," ",data)
# print()
# data = dev.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)
# print ("Measured Distance = %.1f cm" % dist," ",data)
# time.sleep(.5)
# except usb.core.USBError as e:
# data = None
# if e.args == ('Operation timed out',):
# print()
# print ("USB error: Operation timed out")
# print()
# continue
# DG - END
# release the device
# usb.util.release_interface(dev, interface)
# reattach the device to the OS kernel
# print("'USB muis' (046d:c00e) teruggeven aan kernel (OS)")
# dev.attach_kernel_driver(interface)
# cleanup GPIO
print("GPIO cleanup...")
GPIO.output(Motor1E,GPIO.LOW)
GPIO.output(Motor2E,GPIO.LOW)
GPIO.cleanup()
print()