3D Printer - Tank Robot

Post Reply
admin
Site Admin
Posts: 478
Joined: 06 Feb 2007, 13:36

3D Printer - Tank Robot

Post by admin »

Already working Drogerdy - Raspberry Pi Controlled Tank Bot.

Image

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()
DG.
Post Reply