Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
204 changes: 103 additions & 101 deletions Line_Follower.py
Original file line number Diff line number Diff line change
@@ -1,101 +1,103 @@

import smbus
import math
import time

class Line_Follower(object):
def __init__(self, address=0x11, references=[300, 300, 300, 300, 300]):
self.bus = smbus.SMBus(1)
self.address = address
self._references = references

def read_raw(self):
for i in range(0, 5):
try:
raw_result = self.bus.read_i2c_block_data(self.address, 0, 10)
Connection_OK = True
break
except:
Connection_OK = False

if Connection_OK:
return raw_result
else:
return False
print "Error accessing %2X" % self.address

def read_analog(self):
raw_result = self.read_raw()
if raw_result:
analog_result = [0, 0, 0, 0, 0]
for i in range(0, 5):
high_byte = raw_result[i*2] << 8
low_byte = raw_result[i*2+1]
analog_result[i] = high_byte + low_byte
return analog_result

def read_digital(self):
lt = self.read_analog()
digital_list = []
for i in range(0, 5):
if lt[i] > self._references[i]:
digital_list.append(0)
elif lt[i] < self._references[i]:
digital_list.append(1)
else:
digital_list.append(-1)
return digital_list

def get_average(self, mount):
if not isinstance(mount, int):
raise ValueError("Mount must be interger")
average = [0, 0, 0, 0, 0]
lt_list = [[], [], [], [], []]
for times in range(0, mount):
lt = self.read_analog()
for lt_id in range(0, 5):
lt_list[lt_id].append(lt[lt_id])
for lt_id in range(0, 5):
average[lt_id] = int(math.fsum(lt_list[lt_id])/mount)
return average

def found_line_in(self, timeout):
if isinstance(timeout, int) or isinstance(timeout, float):
pass
else:
raise ValueError("timeout must be interger or float")
time_start = time.time()
time_during = 0
while time_during < timeout:
lt_status = self.read_digital()
result = 0
if 1 in lt_status:
return lt_status
time_now = time.time()
time_during = time_now - time_start
return False

def wait_tile_status(self, status):
while True:
lt_status = self.read_digital()
if lt_status in status:
break

def wait_tile_center(self):
while True:
lt_status = self.read_digital()
if lt_status[2] == 1:
break

@property
def references(self):
return self._references

@references.setter
def references(self, value):
self._references = value

if __name__ == '__main__':
lf = Line_Follower()
while True:
print lf.read_analog()

from __future__ import print_function
import smbus
import math
import time
import logging

class Line_Follower(object):
def __init__(self, address=0x11, references=[300, 300, 300, 300, 300]):
self.bus = smbus.SMBus(1)
self.address = address
self._references = references

def read_raw(self):
for i in range(0, 5):
try:
raw_result = self.bus.read_i2c_block_data(self.address, 0, 10)
Connection_OK = True
break
except IOError:
logging.exception('Error reading')
Connection_OK = False

if Connection_OK:
return raw_result
else:
raise RuntimeError("Error accessing %2X" % self.address)

def read_analog(self):
raw_result = self.read_raw()
if raw_result:
analog_result = [0, 0, 0, 0, 0]
for i in range(0, 5):
high_byte = raw_result[i*2] << 8
low_byte = raw_result[i*2+1]
analog_result[i] = high_byte + low_byte
return analog_result

def read_digital(self):
lt = self.read_analog()
digital_list = []
for i in range(0, 5):
if lt[i] > self._references[i]:
digital_list.append(0)
elif lt[i] < self._references[i]:
digital_list.append(1)
else:
digital_list.append(-1)
return digital_list

def get_average(self, mount):
if not isinstance(mount, int):
raise ValueError("Mount must be interger")
average = [0, 0, 0, 0, 0]
lt_list = [[], [], [], [], []]
for times in range(0, mount):
lt = self.read_analog()
for lt_id in range(0, 5):
lt_list[lt_id].append(lt[lt_id])
for lt_id in range(0, 5):
average[lt_id] = int(math.fsum(lt_list[lt_id])/mount)
return average

def found_line_in(self, timeout):
if isinstance(timeout, int) or isinstance(timeout, float):
pass
else:
raise ValueError("timeout must be interger or float")
time_start = time.time()
time_during = 0
while time_during < timeout:
lt_status = self.read_digital()
result = 0
if 1 in lt_status:
return lt_status
time_now = time.time()
time_during = time_now - time_start
return False

def wait_tile_status(self, status):
while True:
lt_status = self.read_digital()
if lt_status in status:
break

def wait_tile_center(self):
while True:
lt_status = self.read_digital()
if lt_status[2] == 1:
break

@property
def references(self):
return self._references

@references.setter
def references(self, value):
self._references = value

if __name__ == '__main__':
lf = Line_Follower()
while True:
print(lf.read_analog())
17 changes: 9 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
## SunFounder UltraSonic_Avoidance
SunFounder UltraSonic_Avoidance
## SunFounder Line Follower
SunFounder Line Follower

Quick Links:

* [About SunFounder UltraSonic_Avoidance](#about_this_module)
* [About SunFounder Line Follower](#about_this_module)
* [Update](#update)
* [About SunFounder](#about_sunfounder)
* [License](#license)
* [Contact us](#contact_us)

<a id="about_this_module"></a>
### About SunFounder UltraSonic_Avoidance:
This module is for SunFounder UltraSonic_Avoidance the PCB board, 25KHz Ultra sonic avoidance module
### About SunFounder Line Follower:
This code is for SunFounder Line Follower module


<a id="update"></a>
### Update:
Expand All @@ -26,14 +27,14 @@ SunFounder is a technology company focused on Raspberry Pi and Arduino open sour
----------------------------------------------
<a id="license"></a>
### License
This is the code for SunFounder UltraSonic_Avoidance.
This is the code for SunFounder Line Follower.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied wa rranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

SunFounder UltraSonic_Avoidance comes with ABSOLUTELY NO WARRANTY; for details run ./show w. This is free software, and you are welcome to redistribute it under certain conditions; run ./show c for details.
SunFounder Line Follower comes with ABSOLUTELY NO WARRANTY; for details run ./show w. This is free software, and you are welcome to redistribute it under certain conditions; run ./show c for details.

SunFounder, Inc., hereby disclaims all copyright interest in the program 'SunFounder UltraSonic_Avoidance' (which makes passes at compilers).

Expand All @@ -50,4 +51,4 @@ website:
www.sunfounder.com

E-mail:
service@sunfounder.com, support@sunfounder.com
service@sunfounder.com, support@sunfounder.com