k31453
Posts: 2
Joined: Thu Mar 30, 2017 6:11 am

Calling Ultrasonic Distance from another Python script

Sun Oct 22, 2017 5:21 am

Hi,

I am developing robot for obstacle avoidance system. Now I have mounted 3 ultrasonic on left and 3 on right.
For programming we are using Python and Raspberry PI.

Basically, what I am trying to do is:
  1. On one script - measure distance for all ultrasonic sensor and put in array.
  2. Pass those Values back to main script
  3. Based on ultrasonic distance manuever robot.
No for getting Distance -- this is the code:

Code: Select all

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)


TRIG = 7
ECHOF = 8
ECHOFL = 10
ECHOFR = 11
ECHOL = 12
ECHOR = 13
ECHOBL = 15
ECHOBR = 19
ECHOB =  21
sensors = [ECHOFL, ECHOFR, ECHOL, ECHOR, ECHOBL, ECHOBR, ECHOB, ECHOF]
sensors_len = len(sensors)
distances = []

GPIO.setup(ECHOF, GPIO.IN)
GPIO.setup(ECHOFL, GPIO.IN)
GPIO.setup(ECHOFR, GPIO.IN)
GPIO.setup(ECHOL, GPIO.IN)
GPIO.setup(ECHOR, GPIO.IN)
GPIO.setup(ECHOBL, GPIO.IN)
GPIO.setup(ECHOBR, GPIO.IN)
GPIO.setup(ECHOB, GPIO.IN)
GPIO.setup(TRIG, GPIO.OUT)            

GPIO.output(TRIG, 0)
print("Setting up")
time.sleep(0.8)
print("| F Left   |  |   FRight   |  |    Left    | |    Right    |  |    BLeft    | |    B Right  | |    Back   | Front  ")
print("_________________________________________________________________________________________________________")

    
def Measurement ():

time.sleep(0.8)

VAR = 1

while VAR ==1:

    for i in range(0, 7):
        
        GPIO.output(TRIG, 1)
        time.sleep(0.00001)
        GPIO.output(TRIG, 0)
        
        while GPIO.input(sensors[i])== 0:
            START = time.time()

        while GPIO.input(sensors[i])==1:
            END = time.time()

        DURATION = END-START
        DISTANCE = DURATION*17150
        DISTANCE = round(DISTANCE, 2)
        DISTANCE = format(DISTANCE, '07')
        distances.append(DISTANCE)
        distances.append(' ')
        


    print(distances)
    distances = []
    time.sleep(0.3)
    return distances

GPIO.cleanup()
   
For our motor driver Pololu DRV8835 , this is the code:

Code: Select all

import wiringpi

# Motor speeds for this library are specified as numbers
# between -MAX_SPEED and MAX_SPEED, inclusive.
_max_speed = 480  # 19.2 MHz / 2 / 480 = 20 kHz
MAX_SPEED = _max_speed

io_initialized = False
def io_init():
  global io_initialized
  if io_initialized:
    return

  wiringpi.wiringPiSetupGpio()
  wiringpi.pinMode(32, wiringpi.GPIO.PWM_OUTPUT)
  wiringpi.pinMode(33, wiringpi.GPIO.PWM_OUTPUT)

  wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
  wiringpi.pwmSetRange(MAX_SPEED)
  wiringpi.pwmSetClock(2)

  wiringpi.pinMode(35, wiringpi.GPIO.OUTPUT)
  wiringpi.pinMode(31, wiringpi.GPIO.OUTPUT)

  io_initialized = True

class Motor(object):
    MAX_SPEED = _max_speed

    def __init__(self, pwm_pin, dir_pin):
        self.pwm_pin = pwm_pin
        self.dir_pin = dir_pin

    def setSpeed(self, speed):
        if speed < 0:
            speed = -speed
            dir_value = 1
        else:
            dir_value = 0

        if speed > MAX_SPEED:
            speed = MAX_SPEED

        io_init()
        wiringpi.digitalWrite(self.dir_pin, dir_value)
        wiringpi.pwmWrite(self.pwm_pin, speed)

class Motors(object):
    MAX_SPEED = _max_speed

    def __init__(self):
        self.motor1 = Motor(12, 5)
        self.motor2 = Motor(13, 6)

    def setSpeeds(self, m1_speed, m2_speed):
        self.motor1.setSpeed(m1_speed)
        self.motor2.setSpeed(m2_speed)

motors = Motors()
Following our main code:

Code: Select all

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
from pololu_drv8835_rpi import motors, MAX_SPEED
from distance import Measurement
##SENSOR SETUP
#PINS

TRIG = 7
ECHOF = 8
ECHOFL = 10
ECHOFR = 11
ECHOL = 12
ECHOR = 13
ECHOBL = 15
ECHOBR = 19
ECHOB =  21

#SENSOR ARRAY
sensors = [ECHOFL, ECHOL, ECHOBL, ECHOB, ECHOBR, ECHOF, ECHOFR, ECHOR]
sensors_len = len(sensors)
distances = []

distancesAVG1 = []
distancesAVG2 = []
distancesAVG3 = []

#GPIOs
GPIO.setup(ECHOF, GPIO.IN)
GPIO.setup(ECHOFL, GPIO.IN)
GPIO.setup(ECHOFR, GPIO.IN)
GPIO.setup(ECHOL, GPIO.IN)
GPIO.setup(ECHOR, GPIO.IN)
GPIO.setup(ECHOBL, GPIO.IN)
GPIO.setup(ECHOBR, GPIO.IN)
GPIO.setup(ECHOB, GPIO.IN)
GPIO.setup(TRIG, GPIO.OUT)

def turnRight():
	print "Turn Right"
	motors.setSpeeds(MAX_SPEED, rspeed)
	
def turnLeft():
	print "Turn Left"
	motors.setSpeeds(lspeed, MAX_SPEED)

def Forward():
	print "Forward"
	motors.setSpeeds(MAX_SPEED, MAX_SPEED)

def Reverse():
	print "Reverse"
	motors.setSpeeds(Blspeed, Brspeed)
	
def Stop():
	print "Stop"
	motors.setSpeeds(0, 0)

try:
    # Start moving forward
    Forward()
	
	while True: # Main Loop
	
	
As you can see, we haven't much done yet for main part as I am struggling to pass the values from distance to main.

User avatar
OutoftheBOTS
Posts: 711
Joined: Tue Aug 01, 2017 10:06 am

Re: Calling Ultrasonic Distance from another Python script

Mon Oct 23, 2017 12:17 pm

your ultra sonic senor code is already defined as a function called Measurement (): that returns a list of all the distances. all you will need to do is import this code into your main program

from "name of file" import Measurement

Return to “Python”