From 75a907f61ee07e8fd472a363910ead288d3dfc65 Mon Sep 17 00:00:00 2001 From: Sam Calisch <s.calisch@gmail.com> Date: Tue, 26 Sep 2017 13:01:03 -0400 Subject: [PATCH] working on getting framing to work consistently --- as5013-test/nrf52-as5013/host.py | 65 +++++++----- as5013-test/nrf52-as5013/nrf52-as5013.ino | 103 +++++++++++++++----- as5013-test/nrf52-as5013/radio.h | 2 + as5013-test/nrf52-drv8825/nrf52-drv8825.ino | 1 + as5013-test/nrf52-drv8825/radio.h | 4 +- 5 files changed, 127 insertions(+), 48 deletions(-) diff --git a/as5013-test/nrf52-as5013/host.py b/as5013-test/nrf52-as5013/host.py index de34586..87699e7 100644 --- a/as5013-test/nrf52-as5013/host.py +++ b/as5013-test/nrf52-as5013/host.py @@ -10,46 +10,65 @@ import matplotlib.animation as animation import bitstring n_samples = 20 +Nx = 20 +Ny = 20 +halls = np.zeros((Nx,Ny,5)) +def roll_left(lst): + return lst[1:] + [lst[0]] def read_as5013_12bit(bytes): return (bitstring.Bits(bytes=bytes, length=16)<<4).unpack('uint:16')[0] #signed 12 bit val comes in two bytes #return struct.unpack("<h",bytearray([ (high<<4) , low<<4 ]))[0] +def read_int16(bytes,signed=False): + try: + n = struct.unpack("<h",bytearray(bytes))[0] if signed else struct.unpack("<H",bytearray(bytes))[0] + return n + except: + print "not properly formatted bytes: ",list(bytes) + return None + def read(ser=None): if ser is None: print "No serial connection!" else: - c = ser.read(n_samples) - data = [read_as5013_12bit(c[x:x+2]) for x in xrange(0,n_samples,2)] + #wait for framing signal at tail of packet + framing = range(8) #we expect the sequence 012...8 + c = [ser.read(1) for i in range(n_samples+4)] + c += [ser.read(1) for i in framing] + while( map(ord,c[n_samples+4:]) != framing ): + c = roll_left(c) + c[-1] = ser.read(1) + print c + #c = ser.read(n_samples+12) #samples (20) + xi (2) + yi (2) + framing (8) + try: + data = [read_as5013_12bit(c[x:x+2]) for x in xrange(0,n_samples,2)] + data += [read_int16(c[x:x+2]) for x in xrange(n_samples,n_samples+4,2)] + except(bitstring.CreationError): + print c return data def main(): try: - ser = serial.Serial(port='/dev/tty.usbserial-FT9L3KWR',baudrate=1000000,timeout=1.) - ser.isOpen() - print "Established serial connection." + #make sure timeout is longer than any period between data. + ser = serial.Serial(port='/dev/tty.usbserial-FT9L3KWR',baudrate=1000000,timeout=5.) + print "Established serial connection" + ser.flush() + while True: + try: + data = np.asarray(read(ser=ser)) + print data[10], data[11], data[1:10:2]-data[:10:2] + if (data[10]<=Nx) and (data[11]<=Ny): + halls[data[10]-1,data[11]-1] = data[1:10:2] - data[:10:2] + except(KeyboardInterrupt): + ser.close() + break except(OSError): #no serial port - print "Couldn't find the serial port, entering debug mode." - ser = None - ser.flush() - - - while True: - #connection, address = serversocket.accept() - - try: - data = np.asarray(read(ser=ser)) - print data[1::2] - data[::2] - except(KeyboardInterrupt): - break - #if data: - # clientsocket.send(data) + print "Couldn't find the serial port." + ser = None print "quitting" - ser.close() - - if __name__ == '__main__': main() diff --git a/as5013-test/nrf52-as5013/nrf52-as5013.ino b/as5013-test/nrf52-as5013/nrf52-as5013.ino index 4c09a76..f4e610d 100644 --- a/as5013-test/nrf52-as5013/nrf52-as5013.ino +++ b/as5013-test/nrf52-as5013/nrf52-as5013.ino @@ -14,16 +14,16 @@ #define sda_pin 1 //XL2 #define rst_pin 3 //A1 static uint8_t txdata[n_tx_bytes] = {0}; -static uint8_t rxdata[n_rx_bytes] = {0}; - -//uint16_t step_period = 30000; //microseconds +static uint8_t rxdata[n_rx_bytes+12] = {0}; //add four bytes for xi, yi over uarte, 8 bytes for framing //uarte const uint8_t pin_rx = 8; const uint8_t pin_tx = 6; uint32_t last_tx_time = 0; -uint32_t tx_period = 1000; //ms +uint32_t tx_period = 200; //ms + +int16_t step_period = 4; // //UARTE @@ -37,7 +37,7 @@ void uarte_setup(){ NRF_UARTE0->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M; NRF_UARTE0->ENABLE = (UARTE_ENABLE_ENABLE_Enabled << UARTE_ENABLE_ENABLE_Pos) & UARTE_ENABLE_ENABLE_Msk; - NRF_UARTE0->TXD.MAXCNT = n_rx_bytes; + NRF_UARTE0->TXD.MAXCNT = n_rx_bytes+12; } @@ -120,38 +120,93 @@ void as5013_read(){ twi_rx(); } -// -//main -// -void setup() { - //Serial.begin(115200); - uarte_setup(); - twi_setup(); - as5013_setup(); - radio_setup(); - +void configure_motor(){ //set step speed radio_buffer[0] = 2; //set step speed - radio_buffer[1] = 10000; //30ms step period + radio_buffer[1] = step_period*1000; //10ms step period radio_send_redundant(); //set full steps radio_buffer[0] = 3; //set step speed - radio_buffer[1] = 0; //M1,M0 = 0,1 + radio_buffer[1] = 0; //M1,M0 = 0,0 radio_send_redundant(); //set current limit radio_buffer[0] = 4; //set step speed radio_buffer[1] = 100; //M1,M0 = 0,1 radio_send_redundant(); +} + +// +//main +// +void setup() { + //Serial.begin(115200); + uarte_setup(); + twi_setup(); + as5013_setup(); + radio_setup(); + NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0: X axis + configure_motor(); + NRF_RADIO->TXADDRESS = 0x01UL; // Set device address 1: Y axis + configure_motor(); + + int16_t xi=0; //counter + int16_t yi=0; //counter + int16_t Nx = 20; //max number of x moves + int16_t Ny = 20; //max number of y moves + int16_t moves_per_step = 8; //8 steps = 10 microns + + //insert framing. + rxdata[n_rx_bytes+4] = (uint8_t)0; + rxdata[n_rx_bytes+5] = (uint8_t)1; + rxdata[n_rx_bytes+6] = (uint8_t)2; + rxdata[n_rx_bytes+7] = (uint8_t)3; + rxdata[n_rx_bytes+8] = (uint8_t)4; + rxdata[n_rx_bytes+9] = (uint8_t)5; + rxdata[n_rx_bytes+10] = (uint8_t)6; + rxdata[n_rx_bytes+11] = (uint8_t)7; + while(1){ - if (millis() - last_tx_time > tx_period){ - as5013_read(); + NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0: X axis + radio_buffer[0] = 1; //send a move command + radio_buffer[1] = moves_per_step; //move 10 steps forward + radio_send_redundant(); //send command + delay(step_period*moves_per_step+1); + xi++; + + as5013_read(); + rxdata[n_rx_bytes] = (uint8_t)(xi); + rxdata[n_rx_bytes+1] = (uint8_t)(xi>>8); + rxdata[n_rx_bytes+2] = (uint8_t)(yi); + rxdata[n_rx_bytes+3] = (uint8_t)(yi>>8); + NRF_UARTE0->TXD.PTR = (uint32_t)(&rxdata); //reset pointer to start of buffer + NRF_UARTE0->TASKS_STARTTX = 1; //trigger start task to send data to host + + delay(50); //for demonstration, not really necessary. + + if (xi==Nx){ + xi=0; + NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0: X axis + radio_buffer[0] = 1; //send a move command + radio_buffer[1] = -moves_per_step*Nx; //move back to start + radio_send_redundant(); //send command + delay(step_period*Nx*moves_per_step+1); + + NRF_RADIO->TXADDRESS = 0x01UL; // Set device address 1: Y axis + radio_buffer[0] = 1; //send a move command + radio_buffer[1] = moves_per_step; //move back to start + radio_send_redundant(); //send command + delay(step_period*moves_per_step+1); + yi++; + } + if (yi==Ny){ + delay(10); + yi=0; + NRF_RADIO->TXADDRESS = 0x01UL; // Set device address 1: Y axis radio_buffer[0] = 1; //send a move command - radio_buffer[1] = 10; //move 10 steps forward - radio_send_redundant(); //send command - NRF_UARTE0->TXD.PTR = (uint32_t)(&rxdata); //reset pointer to start of buffer - NRF_UARTE0->TASKS_STARTTX = 1; //trigger start task - last_tx_time = millis(); + radio_buffer[1] = -moves_per_step*Ny; //move back to start + radio_send_redundant(); //send command + delay(step_period*Ny*moves_per_step+1); } } } diff --git a/as5013-test/nrf52-as5013/radio.h b/as5013-test/nrf52-as5013/radio.h index 89b5972..ab8fa10 100644 --- a/as5013-test/nrf52-as5013/radio.h +++ b/as5013-test/nrf52-as5013/radio.h @@ -21,8 +21,10 @@ void radio_setup(){ NRF_RADIO->PREFIX0 = ((uint32_t)0xC0 << 0); // Prefix byte of address 0 NRF_RADIO->BASE0 = 0x01234567UL; // Base address for prefix 0 + NRF_RADIO->BASE1 = 0x02345678UL; // Base address for prefix 0 NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0 to use when transmitting NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use to select which addresses to receive + //NRF_RADIO->RXADDRESSES = 0x02UL; // Enable device address 1 to use to select which addresses to receive // Packet configuration NRF_RADIO->PCNF0 = (0 << RADIO_PCNF0_S1LEN_Pos) | (0 << RADIO_PCNF0_S0LEN_Pos) | (0 << RADIO_PCNF0_LFLEN_Pos); diff --git a/as5013-test/nrf52-drv8825/nrf52-drv8825.ino b/as5013-test/nrf52-drv8825/nrf52-drv8825.ino index c13df2a..40f4f58 100644 --- a/as5013-test/nrf52-drv8825/nrf52-drv8825.ino +++ b/as5013-test/nrf52-drv8825/nrf52-drv8825.ino @@ -50,6 +50,7 @@ void parse_command(){ } else { NRF_GPIO->OUTCLR = (1<<pin_direction); //set direction backwards } + radio_buffer[1] = radio_buffer[1] > 0 ? radio_buffer[1] : -radio_buffer[1]; for(i=0; i<radio_buffer[1]; i++){ NRF_GPIO->OUTSET = (1<<pin_step); delayMicroseconds(step_period); diff --git a/as5013-test/nrf52-drv8825/radio.h b/as5013-test/nrf52-drv8825/radio.h index 89b5972..edceba6 100644 --- a/as5013-test/nrf52-drv8825/radio.h +++ b/as5013-test/nrf52-drv8825/radio.h @@ -21,8 +21,10 @@ void radio_setup(){ NRF_RADIO->PREFIX0 = ((uint32_t)0xC0 << 0); // Prefix byte of address 0 NRF_RADIO->BASE0 = 0x01234567UL; // Base address for prefix 0 + NRF_RADIO->BASE1 = 0x02345678UL; // Base address for prefix 0 NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0 to use when transmitting - NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use to select which addresses to receive + //NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use to select which addresses to receive + NRF_RADIO->RXADDRESSES = 0x02UL; // Enable device address 1 to use to select which addresses to receive // Packet configuration NRF_RADIO->PCNF0 = (0 << RADIO_PCNF0_S1LEN_Pos) | (0 << RADIO_PCNF0_S0LEN_Pos) | (0 << RADIO_PCNF0_LFLEN_Pos); -- GitLab