This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
motors-scanner-test-1 [2012/09/11 21:46] 81.10.136.85 |
motors-scanner-test-1 [2012/10/08 16:45] (current) 85.218.109.130 |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | salzamt, linz, 11. 09. 2012 | + | ====== salzamt, linz, 11. 09. 2012 ====== |
airodump-ng is scanning the wifi | airodump-ng is scanning the wifi | ||
Line 6: | Line 7: | ||
<code python> | <code python> | ||
+ | #!/usr/bin/python | ||
+ | |||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
import subprocess, glob, time, csv | import subprocess, glob, time, csv | ||
from arduino import Arduino, Servo | from arduino import Arduino, Servo | ||
Line 11: | Line 16: | ||
# scanning part ----------------- | # scanning part ----------------- | ||
- | # if you want to run airodump from python; | + | # airodump-ng is running and logging the results into a csv file |
- | # disadvantage: doesn't run in the background | + | # subprocess looks for the last edited csv file in current folder |
- | #cmd='airodump-ng --bssid 14:D6:4D:B6:97:3C -w /home/selena/doc/synergia/sator/scanning/salzamt1109 mon0' | + | # this file is parsed by the csv module to find the number of data packets that have passed through the network since the last check |
- | #cmd=subprocess.call(cmd.split()) | + | |
- | def lookup(table): | + | listlasted=subprocess.Popen("ls -ct1 $HOME/rknfg/*csv | head -1", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
- | scan=open(table) | + | lasted=listlasted.communicate()[0].strip() |
+ | print lasted | ||
+ | |||
+ | # reading the scan log from a csv file | ||
+ | |||
+ | lookup_key=' # IV' | ||
+ | |||
+ | def lookup(dump): | ||
+ | datalist=[] | ||
+ | scan=open(dump, "rU") | ||
next(scan) | next(scan) | ||
- | scanDict=csv.DictReader(scan, delimiter=',') | + | scanDict=csv.DictReader((line.replace('\0','') for line in scan), delimiter=',') |
for adict in scanDict: | for adict in scanDict: | ||
- | data=adict.get(' # IV') | + | if adict.has_key(lookup_key) and adict.get(lookup_key)!=None: |
- | if data!=None: | + | try: |
- | return data | + | datalist.append(int(adict.get(lookup_key))) |
+ | except: | ||
+ | pass | ||
+ | return sum(datalist) | ||
- | airodump='/home/selena/doc/synergia/sator/scanning/salzamt1109-01.csv' | + | packets=lookup(lasted) |
+ | print 'packets', packets | ||
# moving part ------------------- | # moving part ------------------- | ||
Line 33: | Line 50: | ||
my_board=Arduino(portz) | my_board=Arduino(portz) | ||
- | my_board.output([9, 11]) | + | my_board.output([9, 10]) |
- | linearone=my_board.attachServo(9) | + | linear_one=my_board.attachServo(9) |
- | lineartwo=my_board.attachServo(11) | + | linear_two=my_board.attachServo(10) |
- | position=40 | + | # !!!! motors are not in sync!!!! |
- | linearone.write(position), lineartwo.write(position) | + | # extreme positions of the motor one and two: |
- | time.sleep(1) | + | |
- | packets=int(lookup(airodump)) | + | # | linear one | |
- | print 'packets', packets | + | # 72 - - - - - - - - - - 139 |
- | time.sleep(10) | + | |
+ | # | linear two | | ||
+ | # 87 - - - - - - - - - - 121 | ||
+ | |||
+ | # thus a dictionary of compatible values tupples is used to make sure the two motors are always in the same position | ||
+ | positions = {0:[(72,87)],1:[(73,88)],2:[(74,88)],3:[(75,89)],4:[(76,90)],5:[(77,90)],6:[(78,91)],7:[(82,92)],8:[(83,92)],9:[(84,92)],10:[(86,94)],11:[(88,95)],12:[(90,96)],13:[(92,97)],14:[(93,98)],15:[(95,99)],16:[(98,100)],17:[(100,101)],18:[(102,102)],19:[(103,103)],20:[(104,104)],21:[(106,105)],22:[(107,106)],23:[(109,107)],24:[(110,108)],25:[(114,109)],26:[(117,110)],27:[(120,111)],28:[(122,112)],29:[(124,113)],30:[(125,114)],31:[(128,115)],32:[(129,116)],33:[(130,117)],34:[(132,118)],35:[(135,119)],36:[(137,120)],37:[(139,121)]} | ||
+ | |||
+ | # the main loop ----------------- | ||
+ | |||
+ | # lookup function checks for difference in the number of packets | ||
+ | # it sends the motors to a new position accordingly | ||
+ | |||
+ | max_pos=len(positions)-1 | ||
+ | key_pos=max_pos | ||
+ | |||
+ | # put the motors in the minimum position | ||
+ | linear_one.write(positions[key_pos][0][0]) | ||
+ | linear_two.write(positions[key_pos][0][1]) | ||
+ | time.sleep(5) | ||
while True: | while True: | ||
- | newPackets=int(lookup(airodump)) | + | newPackets=int(lookup(lasted)) |
packetsDiff=newPackets-packets | packetsDiff=newPackets-packets | ||
print 'packetsDiff', packetsDiff | print 'packetsDiff', packetsDiff | ||
- | # decide whether to stretch or shrink: | + | # decide whether to stretch or shrink (when shrinking the height of the space increases): |
- | if packetsDiff>10: | + | # case 1: motors will shrink for one position each; the initial key_pos value needs to be bigger than 0 |
- | newPosition=position+(packetsDiff/5) | + | if packetsDiff>=8 and packetsDiff<50 and key_pos>0: |
- | print 'should stretch', newPosition | + | new_key=key_pos-1 |
- | if newPosition <=140: | + | print 'case 1: new_key=', new_key, 'position:', positions[new_key] |
- | print 'and will do' | + | #print 'linear1 will shrink',positions[new_key][0][0] |
- | linearone.write(newPosition), lineartwo.write(newPosition) | + | #print 'linear2 will shrink',positions[new_key][0][1] |
+ | #print 'current key_pos: ' + str(new_key) + " .. was oldkey: " + str(key_pos) | ||
+ | linear_one.write(positions[new_key][0][0]) | ||
+ | time.sleep(0.3) | ||
+ | linear_two.write(positions[new_key][0][1]) | ||
+ | time.sleep(0.3) | ||
+ | key_pos=new_key #update position | ||
+ | |||
+ | # case 2: motors will shrink for 5 positions; the initial value must be bigger than 5 | ||
+ | elif packetsDiff>=50 and key_pos>0: | ||
+ | new_key=key_pos-5 | ||
+ | if new_key<=0: | ||
+ | print 'case 2: but cannot shrink more' | ||
+ | new_key=1 #reset position | ||
+ | key_pos=new_key #update position | ||
else: | else: | ||
- | print 'already at maximum' | + | print 'case 2: new_key=', new_key, 'position:', positions[new_key] |
- | # reset | + | #print 'linear1 will shrink',positions[new_key][0][0] |
- | position=120 | + | #print 'linear2 will shrink',positions[new_key][0][1] |
- | elif packetsDiff<=0: | + | linear_one.write(positions[new_key][0][0]) |
- | newPosition=position-10 | + | time.sleep(0.3) |
- | print 'shrinking', newPosition | + | linear_two.write(positions[new_key][0][1]) |
- | if newPosition >= 40: | + | time.sleep(0.3) |
- | print 'will do' | + | key_pos=new_key #update position |
- | linearone.write(newPosition), lineartwo.write(newPosition) | + | # case 3: motors will stretch for two positions; the initial value must not be bigger than max_pos |
+ | elif packetsDiff<=0 and key_pos<max_pos: | ||
+ | new_key=key_pos+2 | ||
+ | if new_key>=max_pos: | ||
+ | print 'case 3: but cannot stretch more' | ||
+ | new_key=max_pos | ||
+ | key_pos=new_key #update position | ||
else: | else: | ||
- | print 'already at minumum' | + | print 'case 3: new_key=', new_key, 'position:', positions[new_key] |
- | position=50 | + | #print 'linear1 will stretch',positions[new_key][0][0] |
- | time.sleep(5) | + | #print 'linear2 will stretch',positions[new_key][0][1] |
- | packets=newPackets | + | #print 'current key_pos: ' + str(new_key) + " .. was oldkey: " + str(key_pos) |
- | position=newPosition | + | linear_one.write(positions[new_key][0][0]) |
+ | time.sleep(0.3) | ||
+ | linear_two.write(positions[new_key][0][1]) | ||
+ | time.sleep(0.3) | ||
+ | key_pos=new_key #update position | ||
+ | else: | ||
+ | print "else: packetDiff is too little", packetsDiff | ||
+ | new_key=key_pos | ||
+ | #print 'nothing changed, will stay in the position', positions[new_key] | ||
+ | time.sleep(3) | ||
+ | packets=newPackets #updates the packets | ||
+ | | ||
</code> | </code> | ||
+ | |||
+ | TODO | ||
+ | |||
+ | * positions resolution | ||
+ | * main loop flow: first add or first decide on the limit | ||
+ | * exceptions, restart.... | ||
+ |