Selaa lähdekoodia

Änderungen hinzugefügt. Sensoren waren kaputt, daher mussten wir Workarounds basteln.

master
langspielplatte 5 vuotta sitten
vanhempi
commit
3746a32b31
24 muutettua tiedostoa jossa 945 lisäystä ja 428 poistoa
  1. +0
    -12
      Versuchstag-2/Pipfile
  2. +0
    -51
      Versuchstag-2/Pipfile.lock
  3. BIN
      Versuchstag-2/gpio_class.pyc
  4. +5
    -5
      Versuchstag-2/iot_car.py
  5. BIN
      Versuchstag-2/iot_car.pyc
  6. +0
    -257
      Versuchstag-2/keyikt_main (copy).py
  7. BIN
      Versuchstag-2/linuxWiimoteLib.pyc
  8. BIN
      Versuchstag-2/servo_ctrl.pyc
  9. +46
    -29
      Versuchstag-2/wiikt_main.py
  10. +2
    -1
      Versuchstag-3/simple-client.py
  11. +155
    -0
      Versuchstag-4/autoparking.py
  12. BIN
      Versuchstag-4/autoparking.pyc
  13. +32
    -0
      Versuchstag-4/gpio_class.py
  14. BIN
      Versuchstag-4/gpio_class.pyc
  15. +230
    -55
      Versuchstag-4/ikt_car_sensorik.py
  16. BIN
      Versuchstag-4/ikt_car_sensorik.pyc
  17. +96
    -15
      Versuchstag-4/ikt_car_webserver.py
  18. +111
    -3
      Versuchstag-4/index.html
  19. +143
    -0
      Versuchstag-4/iot_car.py
  20. BIN
      Versuchstag-4/iot_car.pyc
  21. +42
    -0
      Versuchstag-4/sensor_test.py
  22. +62
    -0
      Versuchstag-4/servo_ctrl.py
  23. BIN
      Versuchstag-4/servo_ctrl.pyc
  24. +21
    -0
      Versuchstag-4/set_value.py

+ 0
- 12
Versuchstag-2/Pipfile Näytä tiedosto

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
pygame = "==1.9.4"

[requires]
python_version = "3.8"

+ 0
- 51
Versuchstag-2/Pipfile.lock Näytä tiedosto

{
"_meta": {
"hash": {
"sha256": "66dc4fa611a558e59e4b96b5c720de3680644511017efcb95d30b2a242825bec"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"pygame": {
"hashes": [
"sha256:06dc92ccfea33b85f209db3d49f99a2a30c88fe9fb80fa2564cee443ece787b5",
"sha256:0919a2ec5fcb0d00518c2a5fa99858ccf22d7fbcc0e12818b317062d11386984",
"sha256:0a8c92e700e0042faefa998fa064616f330201890d6ea1c993eb3ff30ab53e99",
"sha256:220a1048ebb3d11a4d48cc4219ec8f65ca62fcafd255239478677625e8ead2e9",
"sha256:315861d2b8428f7b4d56d2c98d6c1acc18f08c77af4b129211bc036774f64be2",
"sha256:3469e87867832fe5226396626a8a6a9dac9b2e21a7819dd8cd96cf0e08bbcd41",
"sha256:54c19960180626165512d596235d75dc022d38844467cec769a8d8153fd66645",
"sha256:5ba598736ab9716f53dc943a659a9578f62acfe00c0c9c5490f3aca61d078f75",
"sha256:60ddc4f361babb30ff2d554132b1f3296490f3149d6c1c77682213563f59937a",
"sha256:6a49ab8616a9de534f1bf62c98beabf0e0bb0b6ff8917576bba22820bba3fdad",
"sha256:6d4966eeba652df2fd9a757b3fc5b29b578b47b58f991ad714471661ea2141cb",
"sha256:700d1781c999af25d11bfd1f3e158ebb660f72ebccb2040ecafe5069d0b2c0b6",
"sha256:73f4c28e894e76797b8ccaf6eb1205b433efdb803c70f489ebc3db6ac9c097e6",
"sha256:786eca2bea11abd924f3f67eb2483bcb22acff08f28dbdbf67130abe54b23797",
"sha256:7bcf586a1c51a735361ca03561979eea3180de45e6165bcdfa12878b752544af",
"sha256:82a1e93d82c1babceeb278c55012a9f5140e77665d372a6d97ec67786856d254",
"sha256:9e03589bc80a21ae951fca7659a767b7cac668289937e3756c0ab3d753cf6d24",
"sha256:aa8926a4e34fb0943abe1a8bb04a0ad82265341bf20064c0862db0a521100dfc",
"sha256:aa90689b889c417d2ac571ef2bbb5f7e735ae30c7553c60fae7508404f46c101",
"sha256:c9f8cdefee267a2e690bf17d61a8f5670b620f25a981f24781b034363a8eedc9",
"sha256:d9177afb2f46103bfc28a51fbc49ce18987a857e5c934db47b4a7030cb30fbd0",
"sha256:deb0551d4bbfb8131e2463a7fe1943bfcec5beb11acdf9c4bfa27fa5a9758d62",
"sha256:e7edfe57a5972aa9130ce9a186020a0f097e7a8e4c25e292109bdae1432b77f9",
"sha256:f0ad32efb9e26160645d62ba6cf3e5a5828dc4e82e8f41f9badfe7b685b07295"
],
"index": "pypi",
"version": "==1.9.4"
}
},
"develop": {}
}

BIN
Versuchstag-2/gpio_class.pyc Näytä tiedosto


+ 5
- 5
Versuchstag-2/iot_car.py Näytä tiedosto

def __init__(self, testmode=True): def __init__(self, testmode=True):
self.is_testmode_activated = testmode self.is_testmode_activated = testmode
if not testmode: if not testmode:
import servo_ctrl
from servo_ctrl import Motor, Steering
self.motor = Motor(1) self.motor = Motor(1)
self.streeting = Steering(2) self.streeting = Steering(2)
else: else:
self.speed_cruise_control = s self.speed_cruise_control = s
def def cruise_control_reset(self):
def cruise_control_reset(self):
self.speed_cruise_control = 0 self.speed_cruise_control = 0
def activate_cruise_control_forward(self): def activate_cruise_control_forward(self):
self.speed_last = self.speed_cur self.speed_last = self.speed_cur
self.speed_cur = self.speed_cruise_control self.speed_cur = self.speed_cruise_control
self.is_testmode_servo_active = True self.is_testmode_servo_active = True
if not is_testmode_activated:
if not self.is_testmode_activated:
self.__accelerate(self.speed_cruise_control) self.__accelerate(self.speed_cruise_control)
def activate_cruise_control_backward(self): def activate_cruise_control_backward(self):
self.speed_last = self.speed_cur self.speed_last = self.speed_cur
self.speed_cur = -1 * self.speed_cruise_control self.speed_cur = -1 * self.speed_cruise_control
self.is_testmode_servo_active = True self.is_testmode_servo_active = True
if not is_testmode_activated:
if not self.is_testmode_activated:
self.__accelerate(-1 * self.speed_cruise_control) self.__accelerate(-1 * self.speed_cruise_control)
def deactivate_cruise_control(self): def deactivate_cruise_control(self):
self.speed_last = self.speed_cur self.speed_last = self.speed_cur
self.speed_cur = 0 self.speed_cur = 0
self.is_testmode_servo_active = False self.is_testmode_servo_active = False
if not is_testmode_activated:
if not self.is_testmode_activated:
self.__accelerate(0) self.__accelerate(0)
def reset_streeting(self): def reset_streeting(self):

BIN
Versuchstag-2/iot_car.pyc Näytä tiedosto


+ 0
- 257
Versuchstag-2/keyikt_main (copy).py Näytä tiedosto

#!/usr/bin/env python2

#######################################################################
# Aufgabe 1 #
#######################################################################

import pygame
import math
import argparse, sys

import servo_ctrl

width = 400
height = 200

freq = 50 # Sets the frequency of input procession
delta = 1.0 / freq # time per step
acc = 2.6 # Max acceleration of the car (per sec.)
dec = 4.5 # Max deceleration of the car (per sec.)
frict = -1 # max friction
angle_acc = 300 # max change of angle (per sec.)

speed_cur = 0
angle_cur = 0

V_MAX = 11 # Maximale Geswindigkeit 11 m/s
ANGLE_MAX = 45

mouse_ctrl = False

v_step = True # Stufenweises regel der Beschlunigung in beide Richtungen
m_step = True

# vars for testmode
is_testmode_enabled = True
testmode_vars = {'is_servo_active': False}

# vars for car
motor = None
streeting = None


# start main pygame event processing loop here
pygame.display.init()

# set up the pygame screen enviroment
screen = pygame.display.set_mode((width, height))

# get a clock to generate frequent behaviour
clock = pygame.time.Clock()


# States of the keys
keystates = {
'quit': False,
'accelerate': False,
'decelerate': False,
'reset': False,
'accelerate_angle_right': False,
'accelerate_angle_left': False,
'acceleration_mouse': False,
'mouse_ctrl': False,
}

running = True

# Functions for exercises

def calculate_acceleration(speed, acc):
sigma = 2.5
mu = V_MAX / 2
return acc * (1 - 0.5 * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2))))))
def calculate_friction(speed, f):
# TODO hier stimmt was nicht
sigma = 4
mu = V_MAX / 2
return (f/2) * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2)))))
def toggle_mouse_ctrl():
global mouse_ctrl
mouse_ctrl= not mouse_ctrl
def mouse_ctrl_calc_velocity(pos):
global height, V_MAX
x, y = pos
rel_y = y - (height/2)
return -1 * (rel_y / (height/2.0)) * V_MAX
def mouse_ctrl_calc_angle(pos):
global width, ANGLE_MAX
x, y = pos
rel_x = x - (width/2.0)
return (rel_x / (width/2)) * ANGLE_MAX
if __name__ == "__main__":

parser = argparse.ArgumentParser(description='IoT Lab script')
parser.add_argument('--notest', action='store_true', default=False)
args = parser.parse_args()
if not args.notest:
print "Running in testmode."
else:
is_testmode_enabled = False
motor = Motor(1)
streeting = Steering(2)
try:
while running:
# set clock frequency
clock.tick(freq);
# save the last speed 4 analysis
last = speed_cur
# process input events
for event in pygame.event.get():
# exit on quit
if event.type == pygame.QUIT:
running = False

# check for key down events (press)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
keystates['quit'] = True
elif event.key == pygame.K_w:
keystates['accelerate'] = True
elif event.key == pygame.K_s:
keystates['decelerate'] = True
elif event.key == pygame.K_d:
keystates['accelerate_angle_right'] = True
elif event.key == pygame.K_a:
keystates['accelerate_angle_left'] = True
elif event.key == pygame.K_m:
keystates['mouse_ctrl'] = True
elif event.key == pygame.K_r:
keystates['reset'] = True

# check for key up events (release)
if event.type == pygame.KEYUP:
if event.key == pygame.K_q:
keystates['quit'] = False
elif event.key == pygame.K_w:
v_step = True
testmode_vars['is_servo_active'] = False
keystates['accelerate'] = False
elif event.key == pygame.K_s:
v_step = True
testmode_vars['is_servo_active'] = False
keystates['decelerate'] = False
elif event.key == pygame.K_d:
keystates['accelerate_angle_right'] = False
elif event.key == pygame.K_a:
keystates['accelerate_angle_left'] = False
elif event.key == pygame.K_m:
keystates['mouse_ctrl'] = False
m_step = True
elif event.key == pygame.K_r:
v_step = True
keystates['reset'] = False
if event.type == pygame.MOUSEBUTTONDOWN:
# linke maustaste
if event.button == 1:
testmode_vars['is_servo_active'] = True
keystates['acceleration_mouse'] = True
if event.type == pygame.MOUSEBUTTONUP:
if event.button == 1:
testmode_vars['is_servo_active'] = False
keystates['acceleration_mouse'] = False
# do something about the key states here, now that the event queue has been processed
if keystates['quit']:
running = False
if keystates['reset']:
# reset
speed_cur = 0
angle_cur = 0
mouse_ctrl = False
if keystates['mouse_ctrl'] and m_step:
# beim umstellen zur maus steuerung und geschw. zuruecksetzen
speed_cur = 0
angle_cur = 0
toggle_mouse_ctrl()
m_step = False
print "Is mouse control enabled?: " + str(mouse_ctrl)
# Calculate valeues for control types
if mouse_ctrl:
pos = pygame.mouse.get_pos()
angle_cur = mouse_ctrl_calc_angle(pos)
if keystates['acceleration_mouse']:
speed_cur = mouse_ctrl_calc_velocity(pos)
elif not is_testmode_enabled:
speed_cur = 0
else:
if keystates['accelerate']: # and v_step:
# Beschleunigen
v_step = False
if is_testmode_enabled:
calc_acc = calculate_acceleration(speed_cur, acc)
speed_cur = min(V_MAX, speed_cur + calc_acc)
testmode_vars['is_servo_active'] = True
else:
speed_cur = min(V_MAX, speed_cur + acc)
if keystates['decelerate']: # and v_step:
# abbremsen
v_step = False
if is_testmode_enabled:
calc_dec = calculate_acceleration(speed_cur, dec)
speed_cur = max(-1 * V_MAX, speed_cur - calc_dec)
testmode_vars['is_servo_active'] = True
else:
speed_cur = max(-1 * V_MAX, speed_cur - dec)
if keystates['accelerate_angle_right']:
# ist das so richtig angle_acc = 300? TODO
angle_cur = min(ANGLE_MAX, angle_cur + angle_acc)
if keystates['accelerate_angle_left']:
# ist das so richtig angle_acc = 300? TODO
angle_cur = max(-1 * ANGLE_MAX, angle_cur - angle_acc)
if not keystates['accelerate_angle_left'] and not keystates['accelerate_angle_right']:
angle_cur = 0
if not is_testmode_enabled and (not keystates['accelerate'] and not keystates['decelerate']):
# Wenn nicht im testmode und weger beschl noch gebremst wird
speed_cur = 0


if is_testmode_enabled:
if not testmode_vars['is_servo_active']:
speed_cur = min(0, speed_cur - calculate_friction(speed_cur, -1))
else:
motor.set_speed(speed_cur)
steering.set_angle(angle_cur)


# Hier denn Wete an servos geben TODO

print("({},{} --> {})".format(speed_cur, angle_cur, (speed_cur - last) / delta)) + ", Servo_active: " + str(testmode_vars['is_servo_active'])
except KeyboardInterrupt:
print "Exiting through keyboard event (CTRL + C)"
# gracefully exit pygame here
pygame.quit()

BIN
Versuchstag-2/linuxWiimoteLib.pyc Näytä tiedosto


BIN
Versuchstag-2/servo_ctrl.pyc Näytä tiedosto


+ 46
- 29
Versuchstag-2/wiikt_main.py Näytä tiedosto

#!/usr/bin/env python #!/usr/bin/env python


####################################################################### #######################################################################
# Aufgabe 2 #
# Aufgabe 2 #
####################################################################### #######################################################################


from linuxWiimoteLib import * from linuxWiimoteLib import *
frim iot_car import Iot_car
from iot_car import Iot_car


# initialize wiimote # initialize wiimote
wiimote = Wiimote() wiimote = Wiimote()
#Insert address and name of device here #Insert address and name of device here
# hcitool scan # hcitool scan
# #
device = ('', '')
# B8:AE:6E:30:0F:0F Nintendo RVL-CNT-01-TR
#
device = ('B8:AE:6E:30:0F:0F', 'Nintendo RVL-CNT-01-TR')


connected = False connected = False


car = Iot_car(testmode=True)
car = Iot_car(testmode=False)


# AUFGABE d # AUFGABE d
def set_led(remote): def set_led(remote):
remote.SetLEDs(True, True, False, False) remote.SetLEDs(True, True, False, False)
elif p > 0.5 and p <= 0.75: elif p > 0.5 and p <= 0.75:
remote.SetLEDs(True, True, True, False) remote.SetLEDs(True, True, True, False)
else:
elif p == 1:
remote.SetLEDs(True, True, True, True) remote.SetLEDs(True, True, True, True)
else:
remote.SetLEDs(False, False, False, False)


try: try:
print "Press any key on wiimote to connect"
while (not connected):
connected = wiimote.Connect(device)
print "Press any key on wiimote to connect"
while (not connected):
connected = wiimote.Connect(device)


print "succesfully connected"
print "succesfully connected"


wiimote.SetAccelerometerMode()

wiistate = wiimote.WiimoteState
while True:
# re-calibrate accelerometer
if (wiistate.ButtonState.Home):
print 're-calibrating'
wiimote.calibrateAccelerometer()
sleep(0.1)
wiimote.SetAccelerometerMode()


wiistate = wiimote.WiimoteState
step = True
counter = 0
print 'entering loop'
while True:
# re-calibrate accelerometer
if (wiistate.ButtonState.Home):
print 're-calibrating'
wiimote.calibrateAccelerometer()
sleep(0.1)
# Set acceleration and deceleration # Set acceleration and deceleration
if wiistate.ButtonState.One: if wiistate.ButtonState.One:
car.activate_cruise_control_forward()
else:
car.deactivate_cruise_control()
if wiistate.ButtonState.Two:
car.activate_cruise_control_forward()
elif wiistate.ButtonState.Two:
car.activate_cruise_control_backward() car.activate_cruise_control_backward()
else: else:
car.deactivate_cruise_control() car.deactivate_cruise_control()
# streeting # streeting
if wiistate.ButtonState.Up: if wiistate.ButtonState.Up:
# streeting left # streeting left
car.car.streeting_left()
car.streeting_left()
if wiistate.ButtonState.Down: if wiistate.ButtonState.Down:
# streeting right # streeting right
car.streeting_right() car.streeting_right()
if not wiistate.ButtonState.Down and not wiistate.ButtonState.Up: if not wiistate.ButtonState.Down and not wiistate.ButtonState.Up:
car.reset_streeting() car.reset_streeting()
if wiistate.ButtonState.Right and step:
car.cruise_control_increase()
step = False
if wiistate.ButtonState.Left and step:
car.cruise_control_decrease()
step = False
# reset button # reset button
if wiistate.ButtonState.Minus: if wiistate.ButtonState.Minus:
car.reset()
car.stop()
car.cruise_control_reset() car.cruise_control_reset()
# set led states # set led states
set_led(wiimote) set_led(wiimote)
counter = counter + 1
if counter == 50:
step = True
counter = 0
delta = 1.0 / 50 delta = 1.0 / 50
print("({},{} --> {})".format(car.speed_cur, car.angle_cur, (car.speed_cur - car.speed_last) / delta)) + ", Servo_active: " + str(car.is_testmode_servo_active) + "CC Speed: " str(car.speed_cruise_control)
sleep(1 / 50)
print wiimote.getAccelState()
#print '({},{} --> {})'.format(car.speed_cur, car.angle_cur, (car.speed_cur - car.speed_last) / delta) + ", Servo_active: " + str(car.is_testmode_servo_active) + " CC Speed: " + str(car.speed_cruise_control)
sleep(0.01)
except KeyboardInterrupt: except KeyboardInterrupt:
print "Exiting through keyboard event (CTRL + C)"
exit(wiimote)
print "Exiting through keyboard event (CTRL + C)"
exit(wiimote)

+ 2
- 1
Versuchstag-3/simple-client.py Näytä tiedosto

parser.add_argument('-s', type=str, required=True, help='IPv4 address of the servers') parser.add_argument('-s', type=str, required=True, help='IPv4 address of the servers')
parser.add_argument('--tcp', action='store_true', help='Use TCP.') parser.add_argument('--tcp', action='store_true', help='Use TCP.')
parser.add_argument('--udp', action='store_true', help='Use UDP.') parser.add_argument('--udp', action='store_true', help='Use UDP.')
parser.add_argument('--raspivid', defalt='-t 0 -fps 20 -w 1280 -h 720 -b 2000000 -o', help='Raspivid arguments.')
args = parser.parse_args() args = parser.parse_args()
if args.udp and args.tcp: if args.udp and args.tcp:
sock.connect((IP,PORT)) sock.connect((IP,PORT))


# raspivid starten # raspivid starten
cmd_raspivid = 'raspivid -t 0 -fps 20 -w 1280 -h 720 -b 2000000 -o -'
cmd_raspivid = 'raspivid ' + args.raspivid + ' -'
rasprocess = subprocess.Popen(cmd_raspivid,shell=True,stdout=subprocess.PIPE) rasprocess = subprocess.Popen(cmd_raspivid,shell=True,stdout=subprocess.PIPE)
while True: while True:

+ 155
- 0
Versuchstag-4/autoparking.py Näytä tiedosto

#!/usr/bin/python
from time import sleep

from iot_car import Iot_car
from ikt_car_sensorik import Value_collector

car = Iot_car(testmode=False)
vc = Value_collector()

def is_state_save(vc):
return True
distance_front = vc.ultrasonic_front.distance
distance_back = vc.ultrasonic_back.distance
if distance_front > 10 and distance_back > 10:
return True
return False

def stop(vc, car):
print 'danger'
car.set_angle(0)
car.accelerate(0)
vc.stop()
exit(0)

def website_stop():
car.set_angle(0)
car.accelerate(0)
vc.stop()

def park_lite():

car.set_angle(0)
car.accelerate(0)
try:
bearing_start = vc.compass.bearing
# steeling right
car.set_angle(45)
sleep(0.2)
print
'Backward'
car.accelerate(-5)
while is_state_save(vc) and not (vc.compass.bearing <= bearing_start - 45):
sleep(0.1)
if not is_state_save(vc):
stop(vc, car)

print
'stop'
car.accelerate(0)
sleep(0.1)
car.set_angle(-45)
sleep(0.1)
print
'Backward'
car.accelerate(-5)
while is_state_save(vc) and not (vc.compass.bearing >= bearing_start):
sleep(0.1)
if not is_state_save(vc):
stop(vc, car)

print
'stop'
car.accelerate(0)
print
'end'

car.accelerate(0)
car.set_angle(0)

except KeyboardInterrupt:
car.accelerate(0)
car.set_angle(0)
vc.stop()
exit(0)

car.accelerate(0)
car.set_angle(0)
vc.stop()
exit(0)



def park():
car = Iot_car(testmode=False)
vc = Value_collector()
car.accelerate(0)
car.set_angle(0)

#angle_offset = -10

print 'Wait for Values'
sleep(10)
print 'Dist Front: ' + str(vc.ultrasonic_front.distance)
print 'Dist Back: ' + str(vc.ultrasonic_back.distance)
speed = 4

car.set_angle(0)
car.accelerate(0)
try:
# drive forward an find gab
print 'Forward'
car.accelerate(0)
while is_state_save(vc) and not vc.infrared.passed_gab:
print vc.infrared.distance
print vc.infrared.passed_gab

sleep(0.1)
if not is_state_save(vc):
stop(vc, car)

print 'stop'
car.accelerate(0)
bearing_start = vc.compass.bearing
# steeling right
car.set_angle(45)
print 'Backward'
car.accelerate(-5)
while is_state_save(vc) and not (vc.compass.bearing <= bearing_start - 45):
sleep(0.1)
if not is_state_save(vc):
stop(vc, car)

print 'stop'
car.accelerate(0)

car.set_angle(-45)
print 'Backward'
car.accelerate(-5)
while is_state_save(vc) and not (vc.compass.bearing >= bearing_start):
sleep(0.1)
if not is_state_save(vc):
stop(vc, car)

print 'stop'
car.accelerate(0)
print 'end'

car.accelerate(0)
car.set_angle(0)

except KeyboardInterrupt:
car.accelerate(0)
car.set_angle(0)
vc.stop()
exit(0)

car.accelerate(0)
car.set_angle(0)
vc.stop()
exit(0)

if __name__ == "__main__":
park()



BIN
Versuchstag-4/autoparking.pyc Näytä tiedosto


+ 32
- 0
Versuchstag-4/gpio_class.py Näytä tiedosto

#!/usr/bin/env python
import os

def sb_write(fd, servo, pulse):
try:
os.write(fd, '%d=%d\n' % (servo,pulse))
except IOError as e:
print e

def write(servo, pulse):
if servo == 1:
if pulse < 100 or pulse > 200:
print 'PWM %d out of range!' % (pulse)
return
if servo == 2:
if pulse < 100 or pulse > 200:
print 'PWM %d out of range!' % (pulse)
return
sb_write(fd, servo, pulse)

try:
fd = os.open('/dev/servoblaster', os.O_WRONLY)
except OSError as e:
print 'could not open /dev/servoblaster'
raise SystemExit(5)
except (KeyboardInterrupt, SystemExit):
os.close(fd)
pass



BIN
Versuchstag-4/gpio_class.pyc Näytä tiedosto


+ 230
- 55
Versuchstag-4/ikt_car_sensorik.py Näytä tiedosto

# #
# Diese Methode soll ein Datenbyte an den Ultraschallsensor senden um eine Messung zu starten # Diese Methode soll ein Datenbyte an den Ultraschallsensor senden um eine Messung zu starten
def write(self,value): def write(self,value):
try:
bus.write_byte_data(self.address, 0x00, 0x51)
except:
try:
bus.write_byte_data(self.address, 0x00, value)
print 'ok'
except:
print "ERROR: Ultrasonic sensor start failed!" print "ERROR: Ultrasonic sensor start failed!"
return 0 return 0


# #
# Diese Methode soll den Lichtwert auslesen und zurueckgeben. # Diese Methode soll den Lichtwert auslesen und zurueckgeben.
def get_brightness(self): def get_brightness(self):
try:
light_v = bus.read_byte_data(self.address, 0x01)
except:
light_v = 0
try:
#self.write(0x51)
sleep(0.1)
#light_v = bus.read_byte_data(self.address, 0x01)
light_v = 100
except:
print "ERROR: Ultrasonic sensor get brightness failed!" print "ERROR: Ultrasonic sensor get brightness failed!"
return light_v return light_v


# #
# Diese Methode soll die Entfernung auslesen und zurueckgeben. # Diese Methode soll die Entfernung auslesen und zurueckgeben.
def get_distance(self): def get_distance(self):
try:
range_High_Byte = bus.read_byte_data(self.address, 0x02)
range_Low_Byte = bus.read_byte_data(self.address, 0x03)
dist = (range_High_Byte << 8) + range_Low_Byte
except:
print "ERROR: Ultrasonic sensor get distance failed!"
dist = 0
try:
#self.write(0x51)
sleep(0.07)
#range_High_Byte = bus.read_byte_data(self.address, 0x02)
#range_Low_Byte = bus.read_byte_data(self.address, 0x03)
#dist = (range_High_Byte << 8) + range_Low_Byte
except:
print "ERROR: Ultrasonic sensor get distance failed!"
return dist return dist


def get_address(self): def get_address(self):
stop = False stop = False


# distance to obstacle in cm # distance to obstacle in cm
distance = 0
distance = 20


# brightness value # brightness value
brightness = 0 brightness = 0
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
def __init__(self, address): def __init__(self, address):
try:
threading.Thread.__init__(self)
time.sleep(0.1)
self.ultrasonic = Ultrasonic(address)
self.setDaemon(True)
self.start()
except:
print "ERROR: Ultrasonic sensor thread init failed!"
return 0
threading.Thread.__init__(self)
#try:
threading.Thread.__init__(self)
sleep(0.1)
self.ultrasonic = Ultrasonic(address)
self.stopped = False
self.setDaemon(True)
#self.start()
#except:
# print "ERROR: Ultrasonic sensor thread init failed!"


# Aufgabe 4 # Aufgabe 4
# #
# Schreiben Sie die Messwerte in die lokalen Variablen # Schreiben Sie die Messwerte in die lokalen Variablen
def run(self): def run(self):
while not self.stopped: while not self.stopped:
distance = self.ultrasonic.get_distance()
brightness = self.ultrasonic.get_brightness()
self.distance = self.ultrasonic.get_distance()
self.brightness = self.ultrasonic.get_brightness()
#print 'Ultrasonic: distance' + str(self.distance)
#print 'Ultrasonic: brightness' + str(self.brightness)
sleep(0.1)
continue continue
def stop(self): def stop(self):
def get_bearing(self): def get_bearing(self):
b = 0 b = 0
try: try:
bear1 = bus.read_byte_data(address, 2)
bear2 = bus.read_byte_data(address, 3)
bear1 = bus.read_byte_data(self.address, 2)
bear2 = bus.read_byte_data(self.address, 3)
bear = (bear1 << 8) + bear2 bear = (bear1 << 8) + bear2
b = bear/10.0 b = bear/10.0
except: except:
# Compass bearing value # Compass bearing value
bearing = 0 bearing = 0


compass = None

stopped = False

# Aufgabe 4 # Aufgabe 4
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
def __init__(self, address): def __init__(self, address):
return 0
threading.Thread.__init__(self)
self.compass = Compass(address)


# Aufgabe 4 # Aufgabe 4
# #
# Diese Methode soll den Kompasswert aktuell halten. # Diese Methode soll den Kompasswert aktuell halten.
def run(self): def run(self):
while not self.stopped: while not self.stopped:
self.bearing = self.compass.get_bearing()
#print 'Compass bearing: ' + str(self.bearing)
sleep(0.1)
continue continue


def stop(self): def stop(self):
def get_voltage(self): def get_voltage(self):
voltage = 0 voltage = 0
try: try:
voltage = bus.read_byte(self.address)
voltage = 3.3 / 255.0 * bus.read_byte(self.address)
except: except:
print "Spannung konnte nicht ausgelesen werden!" print "Spannung konnte nicht ausgelesen werden!"
return voltage
return float(voltage)


# Aufgabe 3 # Aufgabe 3
# #
# Der Spannungswert soll in einen Distanzwert umgerechnet werden. # Der Spannungswert soll in einen Distanzwert umgerechnet werden.
def get_distance(self): def get_distance(self):
# v=(readChannel(0)/1023.0)*3.3
v = self.get_voltage() v = self.get_voltage()
# interpolation von https://tutorials-raspberrypi.de/wp-content/uploads/gp2y0a02yk-600x455.png
dist = 16.2537 * v**4 - 129.893 * v**3 + 382.268 * v**2 - 512.611 * v + 301.439
if v > 0:
dist = (1.0 / (v / 15.69)) - 0.42
else:
dist = 0
return dist return dist


class Windowed_values():

def __init__(self, size=100):
self.size = size
self.values = []

def add(self, value):
if len(self.values) > self.size:
self.values.pop(0)
self.values.append(value)
else:
self.values.append(value)

def get_mean(self):
return sum(self.values) / len(self.values)

def clear(self):
self.values = []


class InfraredThread(threading.Thread): class InfraredThread(threading.Thread):
''' Thread-class for holding Infrared data ''' ''' Thread-class for holding Infrared data '''


# distance to an obstacle in cm # distance to an obstacle in cm
distance = 0 distance = 0
last_distance = 0


# length of parking space in cm # length of parking space in cm
parking_space_length = 0 parking_space_length = 0
parking_step = 0
parking_length_start = 0
parking_length_stop = 0

passed_gab = False


gab_counter = 0

sensor = None
stopped = False
encoder = None
step_count = 0




# Aufgabe 4 # Aufgabe 4
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
def __init__(self, address, encoder=None): def __init__(self, address, encoder=None):
return 0
threading.Thread.__init__(self)
self.sensor = Infrared(address)
self.encoder = encoder

self.windowed_values = Windowed_values()
self.curr_distance_values = Windowed_values(size=10)


def run(self): def run(self):
while not self.stopped: while not self.stopped:
read_infrared_value()
calculate_parking_space_length()
tmp = self.distance
self.distance = self.read_infrared_value()
self.windowed_values.add(self.distance)
self.curr_distance_values.add(self.distance)
#self.parking_space_length = self.calculate_parking_space_length()
self.last_distance = tmp

#print "Window: " + str(self.windowed_values.get_mean())
#print "Value: " + str(self.curr_distance_values.get_mean())
if abs(self.windowed_values.get_mean() - self.curr_distance_values.get_mean()) >= 10:
if self.gab_counter == 1:
self.passed_gab = True
self.gab_counter = 0
self.windowed_values.clear()
self.curr_distance_values.clear()
self.gab_counter = 1
#print 'Infrared distance: ' + str(self.distance)
#print 'Infraread parking: ' + str(self.parking_space_length)

sleep(0.1)




# Aufgabe 4 # Aufgabe 4
# #
# Diese Methode soll den Infrarotwert aktuell halten # Diese Methode soll den Infrarotwert aktuell halten
def read_infrared_value(self):
return 0
def read_infrared_value(self):
return self.sensor.get_distance()


# Aufgabe 5 # Aufgabe 5
# #
# Hier soll die Berechnung der Laenge der Parkluecke definiert werden # Hier soll die Berechnung der Laenge der Parkluecke definiert werden
def calculate_parking_space_length(self): def calculate_parking_space_length(self):
return 0
length = self.parking_space_length
if self.step_count > 5:
self.step_count = 0
if self.parking_step == 0 and self.distance > self.last_distance + 10:
self.parking_step = 1
self.parking_length_start = time()

if self.parking_step == 1 and self.distance + 10 < self.last_distance:
self.parking_step = 0
self.parking_length_stop = time()
length = self.parking_length_stop - self.parking_length_start
#self.passed_gab = True


self.step_count = self.step_count + 1
return length


def stop(self): def stop(self):
self.stopped = True self.stopped = True
# Aufgabe 2 # Aufgabe 2
# #
# Wieviel cm betraegt ein einzelner Encoder-Schritt? # Wieviel cm betraegt ein einzelner Encoder-Schritt?
STEP_LENGTH = 0 # in cm !!!ONP: to measure the wheel!!!
# Wheel is 6.5cm
STEP_LENGTH = 1.27627# in cm !!!ONP: to measure the wheel!!!


# number of encoder steps # number of encoder steps
counter = 0 counter = 0


def __init__(self, pin): def __init__(self, pin):
self.pin = pin self.pin = pin
GPIO.add_event_detect(encoder_pin, GPIO.BOTH, callback=count, bouncetime=1)
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.remove_event_detect(pin)
GPIO.add_event_detect(pin, GPIO.BOTH, callback=self.count, bouncetime=1)


# Aufgabe 2 # Aufgabe 2
# #
# Jeder Flankenwechsel muss zur Berechnung der Entfernung gezaehlt werden. # Jeder Flankenwechsel muss zur Berechnung der Entfernung gezaehlt werden.
# Definieren Sie alle dazu noetigen Methoden. # Definieren Sie alle dazu noetigen Methoden.


def count(channel):
global counter
counter = counter + 1
print "Number of impulses" + str(counter)
def count(self, channel):
self.counter = self.counter + 1
#print "Number of impulses " + str(self.counter)


# Aufgabe 2 # Aufgabe 2
# #
# Diese Methode soll die gesamte zurueckgelegte Distanz zurueckgeben. # Diese Methode soll die gesamte zurueckgelegte Distanz zurueckgeben.
def get_travelled_dist(self): def get_travelled_dist(self):
global counter
global STEP_LENGTH
dist = counter * STEP_LENGTH
dist = self.counter * self.STEP_LENGTH
return dist return dist


class EncoderThread(threading.Thread): class EncoderThread(threading.Thread):


# current speed. # current speed.
speed = 0 speed = 0
last_distance = 0

last_time = 0


# currently traversed distance. # currently traversed distance.
distance = 0 distance = 0


encoder = None

stopped = False

# Aufgabe 4 # Aufgabe 4
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
def __init__(self, encoder): def __init__(self, encoder):
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(encoder_pin, GPIO.IN)
except:
print "ERROR: Encoder GPIO init failed!"
return 0
threading.Thread.__init__(self)
self.encoder = encoder
self.last_time = time()


def run(self): def run(self):
while not self.stopped: while not self.stopped:
get_values()
tmp = self.distance
self.distance = self.encoder.get_travelled_dist()

time_curr = time()
self.speed = (self.distance - self.last_distance) / (time_curr - self.last_time)
self.last_time = time_curr

self.last_distance = tmp

#print 'Encoder traveled distance: ' + str(self.distance)

sleep(0.05)



# Aufgabe 4 # Aufgabe 4
# #
def stop(self): def stop(self):
self.stopped = True self.stopped = True



class Value_collector():

def __init__(self):
e = Encoder(23)
self.ultrasonic_front = UltrasonicThread(0x70)
self.ultrasonic_front.start()
self.ultrasonic_back = UltrasonicThread(0x71)
self.ultrasonic_back.start()
self.infrared = InfraredThread(0x4f, encoder=e)
self.infrared.start()
self.encoder = EncoderThread(e)
self.encoder.start()
self.compass = CompassThread(0x60)
self.compass.start()

def get_values_as_json(self):
return '{"speed":"' +str(self.encoder.speed) \
+ '", "compass":"' + str(self.compass.bearing) \
+ '", "dist0":"' + str(self.infrared.distance) \
+ '", "dist1":"' + str(self.ultrasonic_front.distance) \
+ '", "dist2":"' + str(self.ultrasonic_back.distance) \
+ '", "travel":"' + str(self.encoder.distance) \
+ '", "length":"' + str(self.infrared.parking_space_length) + '"}'

def stop(self):
self.ultrasonic_front.stop()
self.ultrasonic_back.stop()
self.infrared.stop()
self.encoder.stop()
self.compass.stop()


################################################################################# #################################################################################
# Main Thread # Main Thread
#################################################################################
#################################################################################


if __name__ == "__main__": if __name__ == "__main__":


# Aufgabe 6 # Aufgabe 6
# #
# Hier sollen saemtlichen Messwerte periodisch auf der Konsole ausgegeben werden. # Hier sollen saemtlichen Messwerte periodisch auf der Konsole ausgegeben werden.
us_front = Ultrasonic(ultrasonic_front_i2c_address)
us_back = Ultrasonic(ultrasonic_rear_i2c_address)
c = Compass(compass_i2c_address)
i = Infrared(infrared_i2c_address)
e = Encoder(encoder_pin)

while True:
print 'Ultrasonic Front distance: ' + str(us_front.get_distance()) + 'cm'
print 'Ultrasonic Back distance: ' + str(us_back.get_distance()) + 'cm'
print 'Compass bearing: ' + str(c.get_bearing()) + ' degree'
print 'Infrared distance: ' + str(i.get_distance()) + 'cm'
#print 'Traveled distance: ' + str(e.get_travelled_dist())
sleep(1)
print(chr(27) + '[2j')
print('\033c')
print('\x1bc')

#coll = Value_collector()
#run = True
#while run:
#try:
# print 'loop'
# print coll.get_values_as_json()
# sleep(5)
# print
# coll.get_values_as_json()
#except KeyboardInterrupt:
# run = False
# exit(0)
#coll.stop()
GPIO.cleanup()

BIN
Versuchstag-4/ikt_car_sensorik.pyc Näytä tiedosto


+ 96
- 15
Versuchstag-4/ikt_car_webserver.py Näytä tiedosto

#!/usr/bin/python #!/usr/bin/python

import tornado.httpserver import tornado.httpserver
import tornado.ioloop import tornado.ioloop
import tornado.options import tornado.options


import threading import threading
from ikt_car_sensorik import * from ikt_car_sensorik import *
import _servo_ctrl
#import _servo_ctrl
from math import acos, sqrt, degrees from math import acos, sqrt, degrees
import os
from autoparking import *


# Aufgabe 4 # Aufgabe 4
# #
# Der Tornado Webserver soll die Datei index.html am Port 8081 zur Verfügung stellen # Der Tornado Webserver soll die Datei index.html am Port 8081 zur Verfügung stellen


from tornado.options import define, options
define("port", default=8081, help="run on the given port", type=int)

json_message = {}

parking = False
stop = False

class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("index.html")

# Aufgabe 3 # Aufgabe 3
# #
# Der Tornado Webserver muss eine Liste der clients verwalten. # Der Tornado Webserver muss eine Liste der clients verwalten.
print "hello WebSocketHandler" print "hello WebSocketHandler"


def open(self): def open(self):
return 0
print "new connection : {} ".format(self.request.remote_ip)
clients.append(self)


def on_message(self, message): def on_message(self, message):
return 0
global json_message
global parking
global stop
print "message received {} ".format(message)

if message == 'stop_true':
print "Stopping"
stop = True
elif message == 'park_true':
print "Parking"
parking = True
else:
pass

#json_message = {}
#json_message["response"] = message
# json_message = json.dumps(json_message)
# json_message == {"response": message}
self.write_message(json_message)


def on_close(self): def on_close(self):
return 0
print "connection closed"
clients.remove(self)


def check_origin(self, origin):
return True


class DataThread(threading.Thread): class DataThread(threading.Thread):
'''Thread zum Senden der Zustandsdaten an alle Clients aus der Client-Liste''' '''Thread zum Senden der Zustandsdaten an alle Clients aus der Client-Liste'''

stop = False
# Aufgabe 3 # Aufgabe 3
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
def __init__(self): def __init__(self):
return 0
threading.Thread.__init__(self)
self.setDaemon(True)
self.start()
self.stop = False
print "OK: DataThread started!"
# Aufgabe 3 # Aufgabe 3
# #
# Erstellen Sie hier Instanzen von Klassen aus dem ersten Teilversuch
# Erstellen Sie hier Instanzen von Klassen aus dem ersten Teilversuch
def set_sensorik(self, address_ultrasonic_front, address_ultrasonic_back, address_compass, address_infrared, encoder_pin): def set_sensorik(self, address_ultrasonic_front, address_ultrasonic_back, address_compass, address_infrared, encoder_pin):
# nothing need to init for sensor here
return 0 return 0


# Aufgabe 3 # Aufgabe 3
# #
# Hier muessen die Sensorwerte ausgelesen und an alle Clients des Webservers verschickt werden. # Hier muessen die Sensorwerte ausgelesen und an alle Clients des Webservers verschickt werden.
def run(self): def run(self):
while not self.stopped:
continue
global json_message
print "OK: DataThread running!"
getdata = Value_collector()
while 1:
try:
#json_message = {"speed":"5", "compass":"120", "dist":"12", "length":"40"}
json_message = getdata.get_values_as_json()
sleep(1)
except KeyboardInterrupt:
getdata.stop()
#print "OK: DataSetted!"
# get data here


def stop(self): def stop(self):
self.stopped = True
self.stop = True


class DrivingThread(threading.Thread): class DrivingThread(threading.Thread):
'''Thread zum Fahren des Autos''' '''Thread zum Fahren des Autos'''
# Einparken # Einparken
# #
# Hier muss der Thread initialisiert werden. # Hier muss der Thread initialisiert werden.
datatrd = DataThread()
def __init__(self): def __init__(self):
return 0
threading.Thread.__init__(self)
self.setDaemon(True)
self.start()
self.stop = False
print "OK: ParkingThread started!"
# Einparken # Einparken
# #
# Definieren Sie einen Thread, der auf die ueber den Webserver erhaltenen Befehle reagiert und den Einparkprozess durchfuehrt # Definieren Sie einen Thread, der auf die ueber den Webserver erhaltenen Befehle reagiert und den Einparkprozess durchfuehrt
def run(self): def run(self):
while not self.stopped:
continue
global parking
global stop
parklock = False
while 1:
if parking == True and not parklock:
park_lite()
print "OK: Parking started!"
parklock = True
if stop == True:
website_stop()
print "OK: Stop!"


def stop(self): def stop(self):
self.stopped = True
self.stop = True


if __name__ == "__main__": if __name__ == "__main__":
# #
# Erstellen und starten Sie hier eine Instanz des DataThread und starten Sie den Webserver . # Erstellen und starten Sie hier eine Instanz des DataThread und starten Sie den Webserver .


datatrd = DataThread()
parktrd = DrivingThread()

clients = []
# Websocket Server initialization
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/ws", WebSocketHandler), (r"/", IndexHandler), (r'/(.*)', tornado.web.StaticFileHandler, {'path': os.path.dirname(__file__)}),])
httpServer = tornado.httpserver.HTTPServer(app)
httpServer.listen(options.port)
print "Listening on port : ", options.port
tornado.ioloop.IOLoop.instance().start()

#data.start()


# Einparken # Einparken
# #

+ 111
- 3
Versuchstag-4/index.html Näytä tiedosto

<script type="text/javascript" src="smoothie.js"></script> <script type="text/javascript" src="smoothie.js"></script>


Parking control: <button id="btn_start">Start</button>

<button id="btn_stop">Stop</button>
<br>

<!--Aufgabe 4--> <!--Aufgabe 4-->
<!--Für jeden Datensatz muss eine Zeichenfläche 'canvas' definiert werden--> <!--Für jeden Datensatz muss eine Zeichenfläche 'canvas' definiert werden-->


<table border="1">

<tr>
<td>Geschwindigkeit:<br>
<canvas class="canvas" id="speed" width="400" height="150"></canvas><br></td>
<td>Himmelrichtung:<br>
<canvas class="canvas" id="compass" width="400" height="150"></canvas><br></td>
</tr>

<tr>
<td>Abstand vom Auto zum Hindernis:<br></td>
<td>IR:<br>
<canvas class="canvas" id="dist0" width="400" height="150"></canvas><br></td>
</tr>

<tr>
<td>Front:<br>
<canvas class="canvas" id="dist1" width="400" height="150"></canvas><br></td>
<td>Rear:<br>
<canvas class="canvas" id="dist2" width="400" height="150"></canvas><br></td>
</tr>

<tr>
<td>Länge der Parklücke:<br>
<canvas class="canvas" id="length" width="400" height="150"></canvas><br></td>
<td>Encoder Traveled distance:<br>
<canvas class="canvas" id="travel" width="400" height="150"></canvas><br></td>
</tr>

</table>


<!--Einparken --> <!--Einparken -->
<!--Es müssen Knöpfe zum Starten und Stoppen des Parkvorgangs definiert werden--> <!--Es müssen Knöpfe zum Starten und Stoppen des Parkvorgangs definiert werden-->
// Aufgabe 4 // Aufgabe 4
// //
// Damit die Daten dargestellt werden können muss ein Websocket geöffnet werden, der bei jeder neuen Nachricht die Daten aus dieser Nachricht rausholt und visualisiert. // Damit die Daten dargestellt werden können muss ein Websocket geöffnet werden, der bei jeder neuen Nachricht die Daten aus dieser Nachricht rausholt und visualisiert.
var dataSocket = ;
var dataSocket = new WebSocket("ws://192.168.1.42:8081/ws");
// THE IP NEED TO BE CHANGED!

var reply = 'nop';

document.getElementById("btn_stop").addEventListener('click',
()=>{
reply = 'stop_true';
dataSocket.send(reply);
console.log("ParkCtrl: Stopping");
});


document.getElementById("btn_start").addEventListener('click',
()=>{
reply = 'park_true';
dataSocket.send(reply);
console.log("ParkCtrl: Parking");
});


dataSocket.onopen = function(){ dataSocket.onopen = function(){
console.log("connected");
};
console.log("connected");
dataSocket.send('connection established')
};


dataSocket.onmessage = function(evt) { dataSocket.onmessage = function(evt) {
// Aufgabe 4 // Aufgabe 4
// Die empfangenen Daten müssen an die Charts weitergegeben werden. // Die empfangenen Daten müssen an die Charts weitergegeben werden.
// evt.data == {"speed":"value", "compass":"value", "dist":"value", "length":"value"}
console.log(evt.data);
dataSocket.send(reply);
var msg = JSON.parse(evt.data);

speed.append(new Date().getTime(), parseFloat(msg.speed));
compass.append(new Date().getTime(), parseFloat(msg.compass));
dist0.append(new Date().getTime(), parseFloat(msg.dist0));
dist1.append(new Date().getTime(), parseFloat(msg.dist1));
dist2.append(new Date().getTime(), parseFloat(msg.dist2));
length.append(new Date().getTime(), parseFloat(msg.length));
travel.append(new Date().getTime(), parseFloat(msg.travel));
}; };


dataSocket.onclose = function(evt) { dataSocket.onclose = function(evt) {
// Aufgabe 4 // Aufgabe 4
// //
// Für jeden Datensatz muss ein eine SmoothieChart in einem vorher definierten canvas-Element erstellt werden. // Für jeden Datensatz muss ein eine SmoothieChart in einem vorher definierten canvas-Element erstellt werden.
var speedChart = new SmoothieChart({ minValue: 0, maxValue: 15, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var speed = new TimeSeries();
speedChart.addTimeSeries(speed);
speedChart.streamTo(document.getElementById("speed"), 100);
var compassChart = new SmoothieChart({ minValue: 0, maxValue: 360, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var compass = new TimeSeries();
compassChart.addTimeSeries(compass);
compassChart.streamTo(document.getElementById("compass"), 100);
var dist0Chart = new SmoothieChart({ minValue: 0, maxValue: 100, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var dist0 = new TimeSeries();
dist0Chart.addTimeSeries(dist0);
dist0Chart.streamTo(document.getElementById("dist0"), 100);

var dist1Chart = new SmoothieChart({ minValue: 0, maxValue: 100, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var dist1 = new TimeSeries();
dist1Chart.addTimeSeries(dist1);
dist1Chart.streamTo(document.getElementById("dist1"), 100);

var dist2Chart = new SmoothieChart({ minValue: 0, maxValue: 100, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var dist2 = new TimeSeries();
dist2Chart.addTimeSeries(dist2);
dist2Chart.streamTo(document.getElementById("dist2"), 100);
var lengthChart = new SmoothieChart({ minValue: 0, maxValue: 300, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var length = new TimeSeries();
lengthChart.addTimeSeries(length);
lengthChart.streamTo(document.getElementById("length"), 100);

var travelChart = new SmoothieChart({ minValue: 0, maxValue: 500, grid: { strokeStyle: 'rgb(125, 0, 0)', fillStyle: 'rgb(60, 0, 0)', lineWidth: 1, millisPerLine: 500, verticalSections: 6 } });
var travel = new TimeSeries();
travelChart.addTimeSeries(length);
travelChart.streamTo(document.getElementById("travel"), 100);


</script> </script>


</body> </body>

+ 143
- 0
Versuchstag-4/iot_car.py Näytä tiedosto

import math

def calculate_acceleration(speed, acc, V_MAX=11):
sigma = 2.5
mu = V_MAX / 2
return acc * (1 - 0.5 * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2))))))
def calculate_friction(speed, f, V_MAX=11):
# TODO hier stimmt was nicht
sigma = 4
mu = V_MAX / 2
return (f/2) * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2)))))

class Iot_car():

V_MAX = 11 #m/s
A_MAX = 45 # degree
acc = 2.6 # Max acceleration of the car (per sec.)
dec = 4.5 # Max deceleration of the car (per sec.)
frict = -1 # max friction
angle_acc = 300 # max change of angle (per sec.)

is_testmode_activated = True
is_testmode_servo_active = False
speed_cur = 0
speed_last = 0
angle_cur = 0
speed_cruise_control = 0 # m/s but only positive
motor = None
streeting = None

def __init__(self, testmode=True):
self.is_testmode_activated = testmode
if not testmode:
from servo_ctrl import Motor, Steering
self.motor = Motor(1)
self.streeting = Steering(2)
# for keyboard control
def __testmode_accelerate(self):
calc_acc = calculate_acceleration(self.speed_cur, self.acc)
self.speed_last = self.speed_cur
self.speed_cur = min(self.V_MAX, self.speed_cur + calc_acc)
self.is_testmode_servo_active = True
def __testmode_decelerate(self):
calc_dec = calculate_acceleration(self.speed_cur, self.dec)
self.speed_last = self.speed_cur
self.speed_cur = max(-1 * self.V_MAX, self.speed_cur - calc_dec)
self.is_testmode_servo_active = True
def __accelerate(self, speed):
self.speed_last = self.speed_cur
self.speed_cur = speed
self.motor.set_speed(speed)
def accelerate(self, speed=0, direct=False):
if direct and self.is_testmode_activated: # Mouse testmode
self.last = self.speed_cur
self.speed_cur = speed
elif self.is_testmode_activated:
if speed > 0:
self.__testmode_accelerate()
elif speed < 0:
self.__testmode_decelerate()
else:
self.__accelerate(speed)
# for wii remote
def cruise_control_increase(self):
s = min(self.V_MAX, self.speed_cruise_control + 2.75)
if s < 0:
self.speed_cruise_control = 0
else:
self.speed_cruise_control = s
def cruise_control_decrease(self):
s = min(self.V_MAX, self.speed_cruise_control - 2.75)
if s < 0:
self.speed_cruise_control = 0
else:
self.speed_cruise_control = s
def cruise_control_reset(self):
self.speed_cruise_control = 0
def activate_cruise_control_forward(self):
self.speed_last = self.speed_cur
self.speed_cur = self.speed_cruise_control
self.is_testmode_servo_active = True
if not self.is_testmode_activated:
self.__accelerate(self.speed_cruise_control)
def activate_cruise_control_backward(self):
self.speed_last = self.speed_cur
self.speed_cur = -1 * self.speed_cruise_control
self.is_testmode_servo_active = True
if not self.is_testmode_activated:
self.__accelerate(-1 * self.speed_cruise_control)
def deactivate_cruise_control(self):
self.speed_last = self.speed_cur
self.speed_cur = 0
self.is_testmode_servo_active = False
if not self.is_testmode_activated:
self.__accelerate(0)
def reset_streeting(self):
self.set_angle(0)
def streeting_right(self, angle=0):
if angle > 0:
a = angle
else:
a = min(self.A_MAX, self.angle_cur + self.angle_acc)
self.set_angle(a)
def streeting_left(self, angle=0):
if angle < 0:
a = angle
else:
a = max(-1 * self.A_MAX, self.angle_cur - self.angle_acc)
self.set_angle(a)
def set_angle(self, angle):
self.angle_cur = angle
if not self.is_testmode_activated:
self.streeting.set_angle(angle)

def stop(self):
self.speed_last = self.speed_cur
self.speed_cur = 0
self.angle_cur = 0
def symulate(self):
if self.is_testmode_activated:
if not self.is_testmode_servo_active:
self.speed_last = self.speed_cur
self.speed_cur = min(0, self.speed_cur - calculate_friction(self.speed_cur, self.frict))

BIN
Versuchstag-4/iot_car.pyc Näytä tiedosto


+ 42
- 0
Versuchstag-4/sensor_test.py Näytä tiedosto

#!/usr/bin/python

#from smbus import SMBus
import smbus
import time

bus = smbus.SMBus(1) # 1 indicates /dev/i2c-1

address_SRF_v = 0x70 # Addresse vorderer Ultraschallsensor
address_SRF_h = 0x71 # Addresse hinterer Ultraschallsensor

#Messung starten und Messwert in cm
bus.write_byte_data(address_SRF_v, 0x00, 0x51)
bus.write_byte_data(address_SRF_h, 0x00, 0x51)

#Wartezeit von 70 ms
time.sleep(0.07)
# Messwert abholen (vorderer Ultraschallsensor)
range_High_Byte = bus.read_byte_data(address_SRF_v, 0x02) #hoeherwertiges Byte
range_Low_Byte = bus.read_byte_data(address_SRF_v, 0x03) #niederwertiges Byte
# Lichtwert abholen (vorderer Ultraschallsensor)
light_v = bus.read_byte_data(address_SRF_v, 0x01)

print(range_High_Byte)
print(range_Low_Byte)
print(light_v)

#Address Infrarot
address_IR = 0x4f
#Messwert Abholen
distance_IR = bus.read_byte(address_IR)

print('infrared ' + str(distance_IR))

#Address Kompass
address_COM = 0x60
#Messwert abholen
bear_High_Byte = bus.read_byte_data(address_COM, 2) #hoeherwertiges Byte
bear_Low_Byte = bus.read_byte_data(address_COM, 3) #niederwertiges Byte

print(bear_High_Byte)
print(bear_Low_Byte)

+ 62
- 0
Versuchstag-4/servo_ctrl.py Näytä tiedosto

#!/usr/bin/env python

#######################################################################
# Aufgabe 1.3 #
#######################################################################

import gpio_class

def write(servo, pulse):
gpio_class.write(servo, pulse)

class Motor(object):

PWM_PIN = 1 # GPIO pin 11
min_pulse = 100 #ms -> -11 m/s
max_pulse = 200 #ms -> 11 m/s
servo = None
__is_active = False
v_max = 11.0
def __init__(self, servo):
self.servo = servo

def set_speed(self, speed):
if abs(speed) > self.v_max:
speed = self.v_max
if speed == 0:
self.__is_active = False
else:
self.__is_active = True
pulse = 150 + ((speed / self.v_max) * ((self.max_pulse - self.min_pulse)/2))
write(self.servo, pulse)

def stop(self):
self.set_speed(0)
# Aufgabe 1d
def is_active(self):
return self.__is_active

class Steering(object):

PWM_PIN = 2 # GPIO pin 12
min_pulse = 115 # -45
max_pulse = 195 # 45
servo = None
angle_max = 45
def __init__(self, servo):
self.servo = servo

def set_angle(self, angle):
if abs(angle) > self.angle_max:
angle = self.angle_max
pulse = 155 + ((angle / self.angle_max) * ((self.max_pulse - self.min_pulse)/2))
write(self.servo, pulse)
def stop(self):
self.set_angel(0)

BIN
Versuchstag-4/servo_ctrl.pyc Näytä tiedosto


+ 21
- 0
Versuchstag-4/set_value.py Näytä tiedosto

#!/usr/bin/env python2

from iot_car import Iot_car
import argparse

if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Set pwm value for testing. Aufgabe 4d')
parser.add_argument('--motor', action='store_true', default=False)
parser.add_argument('--steering', action='store_true', default=False)
parser.add_argument('-v', '--value', required=True)
args = parser.parse_args()
car = Iot_car(testmode=False)
if args.motor and args.steering:
print "Wrong usage! Can not set both."
exit(1)
elif args.motor:
car.accelerate(float(args.value))
elif args.steering:
car.set_angle(float(args.value))
else:
print "Something went wrong."

Loading…
Peruuta
Tallenna