axispipe.py
· 5.2 KiB · Python
原始檔案
import serial
import pygame
import struct
import os
import sys
import time
class TextPrint:
def __init__(self):
self.reset()
self.font = pygame.font.Font(None, 30)
def show(self, screen, textString):
textBitmap = self.font.render(textString, True, (0,0,0))
screen.blit(textBitmap, [self.x, self.y])
self.y += self.line_height
def reset(self):
self.x = 20
self.y = 20
self.line_height = 25
def indent(self):
self.x += 20
def unindent(self):
self.x -= 20
class AxisPipe:
def __init__(self, port):
self.port = port
self.serial = serial.Serial(port,38400, timeout=0.01)
self.axis = [ 0,0,0,0 ]
self.aux = [ 0,0 ]
def UpdateAxis(self, axis, value):
if self.axis[axis] != value & 0xFFFF:
print "Updating Axis %s with %s" %(axis,value)
self.axis[axis] = value & 0xFFFF
self.serial.write(struct.pack("BBB",axis,value&0xFF,value/0xFF))
def UpdateAux(self, aux, value):
if self.aux[aux] != value & 0xFFFF:
print "Updating Aux %s with %s" %(aux,value)
self.aux[aux] = value & 0xFFFF
self.serial.write(struct.pack("BBB",aux+7,value&0xFF,value/0xFF))
def SetLed(self, val):
self.serial.write(struct.pack("BBB",4,val&0xFF,0))
def ReadData(self):
data = self.serial.readline()
if len(data) > 1:
print "Response: %s" %data.replace("\n","")
def TurnOn(self):
self.serial.write("\x05\x00\x00")
self.UpdateAxis(0,1000);
self.UpdateAxis(1,1000);
self.UpdateAxis(2,1000);
self.UpdateAxis(3,1000);
self.UpdateAux(0,1000);
self.UpdateAux(1,1000);
def TurnOff(self):
self.serial.write("\x06\x00\x00")
def KeepAlive(self):
self.serial.write("\x09\x00\x00")
def Close(self):
self.TurnOff()
self.serial.close()
pygame.init()
screen = pygame.display.set_mode([540,300])
pygame.display.set_caption("Controller")
done = False
ax = AxisPipe("/dev/rfcomm21")
led = 0
leddir = False
clock = pygame.time.Clock()
pygame.joystick.init()
textPrint = TextPrint()
def FixDeadBand(val):
if val >= 1580 or val <= 1420:
return val
else:
return 1500
ax.UpdateAxis(0,1000);
ax.UpdateAxis(1,1000);
ax.UpdateAxis(2,1000);
ax.UpdateAxis(3,1000);
ax.UpdateAux(0,1000);
ax.UpdateAux(1,1000);
while done==False:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done=True
elif event.type == pygame.JOYBUTTONUP:
if event.button == 7:
print "Turning ON the controller"
ax.TurnOn()
elif event.button == 6:
print "Turning OFF the controller"
ax.TurnOff()
elif event.button == 0: # Button A
ax.UpdateAux(0,int(joystick.get_axis(5)*500+1500))
elif event.button == 1: # Button B
ax.UpdateAux(1,int(joystick.get_axis(5)*500+1500))
elif event.type == pygame.KEYUP:
if event.key == 100:
ax.UpdateAxis(1,2000)
elif event.key == 97:
ax.UpdateAxis(1,1000)
else:
ax.UpdateAxis(1,1500)
screen.fill((255,255,255))
textPrint.reset()
if pygame.joystick.get_count() > 0:
joystick = pygame.joystick.Joystick(1)
joystick.init()
textPrint.show(screen, "Joystick {}".format(0) )
textPrint.indent()
name = joystick.get_name()
textPrint.show(screen, "Joystick name: {}".format(name) )
if joystick.get_numaxes() >= 6:
ax.UpdateAxis(0,int(joystick.get_axis(4)*500+1500))
ax.UpdateAxis(1,FixDeadBand(int(joystick.get_axis(2)*250+1500)))
ax.UpdateAxis(2,FixDeadBand(int(-joystick.get_axis(3)*250+1500)))
ax.UpdateAxis(3,FixDeadBand(int(joystick.get_axis(0)*500+1500)))
textPrint.indent()
textPrint.show(screen, "CH1: {}".format(ax.axis[0]))
textPrint.show(screen, "CH2: {}".format(ax.axis[1]))
textPrint.show(screen, "CH3: {}".format(ax.axis[2]))
textPrint.show(screen, "CH4: {}".format(ax.axis[3]))
textPrint.show(screen, "AUX0: {}".format(ax.aux[0]))
textPrint.show(screen, "AUX1: {}".format(ax.aux[1]))
textPrint.unindent()
else:
textPrint.show(screen, "No Joystick Available" )
ax.UpdateAxis(0,0);
ax.UpdateAxis(1,0);
ax.UpdateAxis(2,0);
ax.UpdateAxis(3,0);
ax.ReadData()
if leddir:
if led >= 255:
led = 255
leddir = False
else:
led += 5
else:
if led <= 0:
led = 0
leddir = True
else:
led -= 5
#ax.SetLed(led);
textPrint.show(screen, "LED: {}".format(led) )
textPrint.unindent()
textPrint.unindent()
pygame.display.flip()
ax.KeepAlive()
clock.tick(240) # We need to update the KeepAlive more than 70 times per sec
ax.Close()
pygame.quit ()
| 1 | import serial |
| 2 | import pygame |
| 3 | import struct |
| 4 | import os |
| 5 | import sys |
| 6 | import time |
| 7 | class TextPrint: |
| 8 | def __init__(self): |
| 9 | self.reset() |
| 10 | self.font = pygame.font.Font(None, 30) |
| 11 | |
| 12 | def show(self, screen, textString): |
| 13 | textBitmap = self.font.render(textString, True, (0,0,0)) |
| 14 | screen.blit(textBitmap, [self.x, self.y]) |
| 15 | self.y += self.line_height |
| 16 | |
| 17 | def reset(self): |
| 18 | self.x = 20 |
| 19 | self.y = 20 |
| 20 | self.line_height = 25 |
| 21 | |
| 22 | def indent(self): |
| 23 | self.x += 20 |
| 24 | |
| 25 | def unindent(self): |
| 26 | self.x -= 20 |
| 27 | |
| 28 | class AxisPipe: |
| 29 | def __init__(self, port): |
| 30 | self.port = port |
| 31 | self.serial = serial.Serial(port,38400, timeout=0.01) |
| 32 | self.axis = [ 0,0,0,0 ] |
| 33 | self.aux = [ 0,0 ] |
| 34 | |
| 35 | def UpdateAxis(self, axis, value): |
| 36 | if self.axis[axis] != value & 0xFFFF: |
| 37 | print "Updating Axis %s with %s" %(axis,value) |
| 38 | self.axis[axis] = value & 0xFFFF |
| 39 | self.serial.write(struct.pack("BBB",axis,value&0xFF,value/0xFF)) |
| 40 | |
| 41 | def UpdateAux(self, aux, value): |
| 42 | if self.aux[aux] != value & 0xFFFF: |
| 43 | print "Updating Aux %s with %s" %(aux,value) |
| 44 | self.aux[aux] = value & 0xFFFF |
| 45 | self.serial.write(struct.pack("BBB",aux+7,value&0xFF,value/0xFF)) |
| 46 | |
| 47 | def SetLed(self, val): |
| 48 | self.serial.write(struct.pack("BBB",4,val&0xFF,0)) |
| 49 | |
| 50 | def ReadData(self): |
| 51 | data = self.serial.readline() |
| 52 | if len(data) > 1: |
| 53 | print "Response: %s" %data.replace("\n","") |
| 54 | |
| 55 | def TurnOn(self): |
| 56 | self.serial.write("\x05\x00\x00") |
| 57 | self.UpdateAxis(0,1000); |
| 58 | self.UpdateAxis(1,1000); |
| 59 | self.UpdateAxis(2,1000); |
| 60 | self.UpdateAxis(3,1000); |
| 61 | |
| 62 | self.UpdateAux(0,1000); |
| 63 | self.UpdateAux(1,1000); |
| 64 | |
| 65 | def TurnOff(self): |
| 66 | self.serial.write("\x06\x00\x00") |
| 67 | |
| 68 | def KeepAlive(self): |
| 69 | self.serial.write("\x09\x00\x00") |
| 70 | |
| 71 | def Close(self): |
| 72 | self.TurnOff() |
| 73 | self.serial.close() |
| 74 | |
| 75 | pygame.init() |
| 76 | |
| 77 | screen = pygame.display.set_mode([540,300]) |
| 78 | pygame.display.set_caption("Controller") |
| 79 | |
| 80 | done = False |
| 81 | ax = AxisPipe("/dev/rfcomm21") |
| 82 | led = 0 |
| 83 | leddir = False |
| 84 | clock = pygame.time.Clock() |
| 85 | |
| 86 | |
| 87 | pygame.joystick.init() |
| 88 | textPrint = TextPrint() |
| 89 | |
| 90 | def FixDeadBand(val): |
| 91 | if val >= 1580 or val <= 1420: |
| 92 | return val |
| 93 | else: |
| 94 | return 1500 |
| 95 | |
| 96 | ax.UpdateAxis(0,1000); |
| 97 | ax.UpdateAxis(1,1000); |
| 98 | ax.UpdateAxis(2,1000); |
| 99 | ax.UpdateAxis(3,1000); |
| 100 | |
| 101 | ax.UpdateAux(0,1000); |
| 102 | ax.UpdateAux(1,1000); |
| 103 | |
| 104 | while done==False: |
| 105 | for event in pygame.event.get(): |
| 106 | if event.type == pygame.QUIT: |
| 107 | done=True |
| 108 | elif event.type == pygame.JOYBUTTONUP: |
| 109 | if event.button == 7: |
| 110 | print "Turning ON the controller" |
| 111 | ax.TurnOn() |
| 112 | elif event.button == 6: |
| 113 | print "Turning OFF the controller" |
| 114 | ax.TurnOff() |
| 115 | elif event.button == 0: # Button A |
| 116 | ax.UpdateAux(0,int(joystick.get_axis(5)*500+1500)) |
| 117 | elif event.button == 1: # Button B |
| 118 | ax.UpdateAux(1,int(joystick.get_axis(5)*500+1500)) |
| 119 | elif event.type == pygame.KEYUP: |
| 120 | if event.key == 100: |
| 121 | ax.UpdateAxis(1,2000) |
| 122 | elif event.key == 97: |
| 123 | ax.UpdateAxis(1,1000) |
| 124 | else: |
| 125 | ax.UpdateAxis(1,1500) |
| 126 | |
| 127 | screen.fill((255,255,255)) |
| 128 | |
| 129 | textPrint.reset() |
| 130 | |
| 131 | if pygame.joystick.get_count() > 0: |
| 132 | joystick = pygame.joystick.Joystick(1) |
| 133 | joystick.init() |
| 134 | |
| 135 | textPrint.show(screen, "Joystick {}".format(0) ) |
| 136 | textPrint.indent() |
| 137 | name = joystick.get_name() |
| 138 | textPrint.show(screen, "Joystick name: {}".format(name) ) |
| 139 | if joystick.get_numaxes() >= 6: |
| 140 | ax.UpdateAxis(0,int(joystick.get_axis(4)*500+1500)) |
| 141 | ax.UpdateAxis(1,FixDeadBand(int(joystick.get_axis(2)*250+1500))) |
| 142 | ax.UpdateAxis(2,FixDeadBand(int(-joystick.get_axis(3)*250+1500))) |
| 143 | ax.UpdateAxis(3,FixDeadBand(int(joystick.get_axis(0)*500+1500))) |
| 144 | textPrint.indent() |
| 145 | textPrint.show(screen, "CH1: {}".format(ax.axis[0])) |
| 146 | textPrint.show(screen, "CH2: {}".format(ax.axis[1])) |
| 147 | textPrint.show(screen, "CH3: {}".format(ax.axis[2])) |
| 148 | textPrint.show(screen, "CH4: {}".format(ax.axis[3])) |
| 149 | textPrint.show(screen, "AUX0: {}".format(ax.aux[0])) |
| 150 | textPrint.show(screen, "AUX1: {}".format(ax.aux[1])) |
| 151 | textPrint.unindent() |
| 152 | |
| 153 | else: |
| 154 | textPrint.show(screen, "No Joystick Available" ) |
| 155 | ax.UpdateAxis(0,0); |
| 156 | ax.UpdateAxis(1,0); |
| 157 | ax.UpdateAxis(2,0); |
| 158 | ax.UpdateAxis(3,0); |
| 159 | |
| 160 | ax.ReadData() |
| 161 | if leddir: |
| 162 | if led >= 255: |
| 163 | led = 255 |
| 164 | leddir = False |
| 165 | else: |
| 166 | led += 5 |
| 167 | else: |
| 168 | if led <= 0: |
| 169 | led = 0 |
| 170 | leddir = True |
| 171 | else: |
| 172 | led -= 5 |
| 173 | #ax.SetLed(led); |
| 174 | textPrint.show(screen, "LED: {}".format(led) ) |
| 175 | textPrint.unindent() |
| 176 | textPrint.unindent() |
| 177 | pygame.display.flip() |
| 178 | ax.KeepAlive() |
| 179 | clock.tick(240) # We need to update the KeepAlive more than 70 times per sec |
| 180 | |
| 181 | ax.Close() |
| 182 | pygame.quit () |
axispipe_328.ino
· 2.2 KiB · Arduino
原始檔案
#include <Servo.h>
Servo ch[6];
unsigned char buff[3];
unsigned short count;
unsigned short kcount = 0;
void TurnOn() {
ch[0].attach(3);
ch[1].attach(5);
ch[2].attach(6);
ch[3].attach(9);
ch[4].attach(8);
ch[5].attach(10);
digitalWrite(13, HIGH);
Serial.println("Controller ON");
}
void TurnOff() {
for(int i=0;i<6;i++)
ch[i].detach();
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(13, LOW);
Serial.println("Controller OFF");
}
void KeepAlive() {
TCCR2B = 0x00;
TCNT2 = 0x00;
TIFR2 = 0x00;
TIMSK2 = 0x01;
TCCR2A = 0x00;
TCCR2B |= (1<< CS12) | (1<< CS10);
kcount = 0;
}
ISR(TIMER2_OVF_vect) {
//We didnt receive the signal yet. So we must shutdown the output
kcount++;
if(kcount == 255)
TurnOff();
TCCR2B = 0x00;
TCNT2 = 0x00;
TIFR2 = 0x00;
TIMSK2 = 0x01;
TCCR2A = 0x00;
TCCR2B |= (1<< CS12) | (1<< CS10);
}
void setup() {
Serial.begin(38400);
Serial.println("Inititializing controllers");
pinMode(13, OUTPUT);
pinMode(3, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
count = 0;
Serial.println("AxisPipe Started!");
KeepAlive();
}
void loop() {
short val;
if(count == 3) {
count = 0;
val = buff[1] + buff[2] * 256;
switch(buff[0]) {
case 0:
case 1:
case 2:
case 3:
ch[buff[0]].writeMicroseconds(val);
break;
case 4: break; // Nothing on 328
case 5: TurnOn(); break;
case 6: TurnOff(); break;
case 7:
case 8: // Aux Outputs
ch[buff[0]-3].writeMicroseconds(val);
break;
case 9: break;
default:
Serial.println("Unknown CMD");
}
KeepAlive();
}
if (Serial.available() > 0) {
buff[count] = Serial.read();
count++;
}
}
| 1 | #include <Servo.h> |
| 2 | |
| 3 | Servo ch[6]; |
| 4 | |
| 5 | unsigned char buff[3]; |
| 6 | unsigned short count; |
| 7 | unsigned short kcount = 0; |
| 8 | void TurnOn() { |
| 9 | ch[0].attach(3); |
| 10 | ch[1].attach(5); |
| 11 | ch[2].attach(6); |
| 12 | ch[3].attach(9); |
| 13 | ch[4].attach(8); |
| 14 | ch[5].attach(10); |
| 15 | digitalWrite(13, HIGH); |
| 16 | Serial.println("Controller ON"); |
| 17 | } |
| 18 | |
| 19 | void TurnOff() { |
| 20 | for(int i=0;i<6;i++) |
| 21 | ch[i].detach(); |
| 22 | digitalWrite(3, LOW); |
| 23 | digitalWrite(5, LOW); |
| 24 | digitalWrite(6, LOW); |
| 25 | digitalWrite(8, LOW); |
| 26 | digitalWrite(9, LOW); |
| 27 | digitalWrite(10, LOW); |
| 28 | digitalWrite(13, LOW); |
| 29 | Serial.println("Controller OFF"); |
| 30 | } |
| 31 | |
| 32 | void KeepAlive() { |
| 33 | TCCR2B = 0x00; |
| 34 | TCNT2 = 0x00; |
| 35 | TIFR2 = 0x00; |
| 36 | TIMSK2 = 0x01; |
| 37 | TCCR2A = 0x00; |
| 38 | TCCR2B |= (1<< CS12) | (1<< CS10); |
| 39 | kcount = 0; |
| 40 | } |
| 41 | |
| 42 | ISR(TIMER2_OVF_vect) { |
| 43 | //We didnt receive the signal yet. So we must shutdown the output |
| 44 | kcount++; |
| 45 | if(kcount == 255) |
| 46 | TurnOff(); |
| 47 | TCCR2B = 0x00; |
| 48 | TCNT2 = 0x00; |
| 49 | TIFR2 = 0x00; |
| 50 | TIMSK2 = 0x01; |
| 51 | TCCR2A = 0x00; |
| 52 | TCCR2B |= (1<< CS12) | (1<< CS10); |
| 53 | } |
| 54 | |
| 55 | void setup() { |
| 56 | Serial.begin(38400); |
| 57 | Serial.println("Inititializing controllers"); |
| 58 | pinMode(13, OUTPUT); |
| 59 | pinMode(3, OUTPUT); |
| 60 | pinMode(5, OUTPUT); |
| 61 | pinMode(6, OUTPUT); |
| 62 | pinMode(8, OUTPUT); |
| 63 | pinMode(9, OUTPUT); |
| 64 | pinMode(10, OUTPUT); |
| 65 | |
| 66 | digitalWrite(3, LOW); |
| 67 | digitalWrite(5, LOW); |
| 68 | digitalWrite(6, LOW); |
| 69 | digitalWrite(8, LOW); |
| 70 | digitalWrite(9, LOW); |
| 71 | digitalWrite(10, LOW); |
| 72 | |
| 73 | count = 0; |
| 74 | Serial.println("AxisPipe Started!"); |
| 75 | KeepAlive(); |
| 76 | } |
| 77 | |
| 78 | void loop() { |
| 79 | short val; |
| 80 | if(count == 3) { |
| 81 | count = 0; |
| 82 | val = buff[1] + buff[2] * 256; |
| 83 | switch(buff[0]) { |
| 84 | case 0: |
| 85 | case 1: |
| 86 | case 2: |
| 87 | case 3: |
| 88 | ch[buff[0]].writeMicroseconds(val); |
| 89 | break; |
| 90 | case 4: break; // Nothing on 328 |
| 91 | case 5: TurnOn(); break; |
| 92 | case 6: TurnOff(); break; |
| 93 | case 7: |
| 94 | case 8: // Aux Outputs |
| 95 | ch[buff[0]-3].writeMicroseconds(val); |
| 96 | break; |
| 97 | case 9: break; |
| 98 | default: |
| 99 | Serial.println("Unknown CMD"); |
| 100 | } |
| 101 | KeepAlive(); |
| 102 | } |
| 103 | if (Serial.available() > 0) { |
| 104 | buff[count] = Serial.read(); |
| 105 | count++; |
| 106 | } |
| 107 | |
| 108 | } |