From 9af54029a8d17b94bfed3b055aecc75af408b85d Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 22 Nov 2019 17:51:58 +0100 Subject: [PATCH 01/20] more stuff on the arm --- arm/arm/arm.c | 83 ++++++++++++++++++++++++----------------- arm/arm/arm.h | 3 ++ arm/arm/main.c | 44 ++++++++++++++++++---- arm/arm/serial.c | 2 +- arm/arm/styr_komm.c | 3 +- arm/arm/styrmodul.cproj | 2 +- 6 files changed, 93 insertions(+), 44 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 3598d063..e3ec121b 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -12,10 +12,8 @@ #include <string.h> #include "arm.h" - #define F_CPU 16000000L - //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { "Model Number", @@ -23,7 +21,7 @@ const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { "Firmware Version", "ID", "Baud Rate", - "Return Delay Time", + "Return Delay Time",//330 "CW Angle Limit", "", "CCW Angle Limit", @@ -69,6 +67,8 @@ const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { "Punch" }; + + /** * Sets the position limits for all servos */ @@ -86,10 +86,10 @@ servo_init(){ set_ccw_limit(4,0x03FF,IMODE_WRITE); _delay_ms(100); set_cw_limit(5,0x0000,IMODE_WRITE);//TODO check limits - set_ccw_limit(5,0x03FF,IMODE_WRITE); + set_ccw_limit(5,0x0330,IMODE_WRITE); _delay_ms(100); set_cw_limit(6,0x00FF,IMODE_WRITE); - set_ccw_limit(6,0x0333,IMODE_WRITE); + set_ccw_limit(6,0x0330,IMODE_WRITE); _delay_ms(100); set_cw_limit(7,0x0000,IMODE_WRITE); set_ccw_limit(7,0x03FF,IMODE_WRITE); @@ -133,22 +133,32 @@ void set_moving_speed(uint8_t id, uint16_t speed, uint8_t imode){ write_two_bytes(id, "Moving Speed", speed, 2, imode); } +void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode){ + write_two_bytes(id, "Max Torque", torque, 2, imode); +} + +void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode){ + write_two_bytes(id, "Baud Rate", baud_rate, 1, imode); +} + void arm_rotate_90_left(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x00D5,imode); } void lower_arm(){ - move_to_angle(5, 0x00FF, 0x00EF, IMODE_WRITE); //4 straight up + + + + +} + +void raise_arm(){ + move_to_angle(2,0x00FF,0x031F,IMODE_WRITE); _delay_ms(5000); - move_to_angle(2, 0x00FF, 0x00EF, IMODE_REG_WRITE); //2 straight up - //_delay_ms(5000); - move_to_angle(6, 0x00FF, 0x027F, IMODE_REG_WRITE); - move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); + move_to_angle(5,0x00FF,0x0330,IMODE_REG_WRITE); + move_to_angle(6,0x00FF,0x01FF,IMODE_REG_WRITE); send_action(); - _delay_ms(5000); - } -/**/ /** * Moves the servo with the given id to a given goal position with the given speed @@ -165,31 +175,36 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i uint8_t higher_byte_speed = speed >> 8; uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos, higher_byte_pos, lower_byte_speed, higher_byte_speed}; - - if (id == 2 || id == 3 || id == 4 || id == 5){//Servo-pairs (2 and 3) and (4 and 5) should always move together with "opposite" goal_position - uint16_t goal_position_2 = 0x03FF - goal_position_2; + send_instruction(id, imode, params, 5); + + if (id == 2){//Servo 2 and 3 should always move together + uint16_t goal_position_3 = 0x03FF - goal_position; + uint8_t lower_byte_pos_3 = goal_position_3 & 0xFF; + uint8_t higher_byte_pos_3 = goal_position_3 >> 8; + uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_3, higher_byte_pos_3, lower_byte_speed, higher_byte_speed}; + send_instruction(3, imode, params, 5); + } + else if(id == 3){ + uint16_t goal_position_2 = 0x03FF - goal_position; uint8_t lower_byte_pos_2 = goal_position_2 & 0xFF; uint8_t higher_byte_pos_2 = goal_position_2 >> 8; uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_2, higher_byte_pos_2, lower_byte_speed, higher_byte_speed}; - switch (id) { - case 2: - send_instruction(3, imode, params, 5); - break; - case 3: - send_instruction(2, imode, params, 5); - break; - case 4: - send_instruction(5, imode, params, 5); - break; - case 5: - send_instruction(4, imode, params, 5); - break; - default: - break; - } + send_instruction(4, imode, params, 5); + } + if (id == 4){//Servo 4 and 5 should always move together + uint16_t goal_position_5 = 0x03FF - goal_position; + uint8_t lower_byte_pos_5 = goal_position_5 & 0xFF; + uint8_t higher_byte_pos_5 = goal_position_5 >> 8; + uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_5, higher_byte_pos_5, lower_byte_speed, higher_byte_speed}; + send_instruction(5, imode, params, 5); + } + else if(id == 5){ + uint16_t goal_position_4 = 0x03FF - goal_position; + uint8_t lower_byte_pos_4 = goal_position_4 & 0xFF; + uint8_t higher_byte_pos_4 = goal_position_4 >> 8; + uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_4, higher_byte_pos_4, lower_byte_speed, higher_byte_speed}; + send_instruction(4, imode, params, 5); } - - send_instruction(id, imode, params, 5); } /** diff --git a/arm/arm/arm.h b/arm/arm/arm.h index b23d5fb1..788e29d7 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -60,5 +60,8 @@ void write_two_bytes(uint8_t id, char *name, uint16_t arg, uint8_t param_len, ui void send_instruction(uint8_t id, uint8_t imode, uint8_t *params, uint8_t param_len); void arm_rotate_90_left(uint16_t speed,uint8_t imode); void set_return_delay(uint8_t id, uint16_t delay, uint8_t imode); +void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode); +void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode); +void raise_arm(); #endif ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 35cbfbdd..ecacd719 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -48,36 +48,66 @@ int main(void){ } // init - servo_init(); + //servo_init(); pwm_init(); + set_return_delay(1,254,IMODE_WRITE); + set_baud_rate(0xFE,103,IMODE_WRITE); + + //set_max_torque(4, 0x300,IMODE_WRITE); + //set_max_torque(5, 0x300,IMODE_WRITE); /************************************************************************/ /* TEST BELOW */ /************************************************************************/ - //set_return_delay(1,250,IMODE_WRITE); + move_to_angle(1,0x00FF,0x01FF,IMODE_WRITE); + _delay_ms(10000); arm_rotate_90_left(0x00FF,IMODE_WRITE); + _delay_ms(3000); + //lower_arm(); + move_to_angle(6, 0x00AF, 0x02FF, IMODE_REG_WRITE); + move_to_angle(5, 0x00AF, 0x01FF, IMODE_REG_WRITE); + send_action(); + _delay_ms(5000); + move_to_angle(2, 0x00AF, 0x013F, IMODE_WRITE); + _delay_ms(4000); + raise_arm(); + _delay_ms(5000); + move_to_angle(6, 0x00AF, 0x02FF, IMODE_REG_WRITE); + move_to_angle(5, 0x00AF, 0x01FF, IMODE_REG_WRITE); + send_action(); + _delay_ms(5000); + move_to_angle(2, 0x00AF, 0x013F, IMODE_WRITE); + _delay_ms(4000); + raise_arm(); _delay_ms(5000); - lower_arm(); + move_to_angle(1,0x00FF,0x01FF,IMODE_WRITE); /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ - /*UCSR1B &= ~(_BV(RXEN1)); + UCSR1B &= ~(_BV(RXEN1)); UCSR1B |= _BV(TXEN1); //~(_BV(U2X0)); ping(1); DDRD = 0; UCSR1B &= ~(_BV(TXEN1)); UCSR1B |= _BV(RXEN1); - /*volatile uint8_t b1, b2, b3,b4,b5; + volatile uint8_t b1, b2, b3,b4,b5,b6,b7,b8,b9,b10; while(1){ b1 = uart_1_getchar(); b2 = uart_1_getchar(); b3 = uart_1_getchar(); b4 = uart_1_getchar(); b5 = uart_1_getchar(); + b6 = uart_1_getchar(); + b7 = uart_1_getchar(); + b8 = uart_1_getchar(); + b9 = uart_1_getchar(); + b10 = uart_1_getchar(); + } + //translate_instruction(b1,b2,b3); - } - */ + + return 0; } diff --git a/arm/arm/serial.c b/arm/arm/serial.c index 440c7818..52ef7ee5 100644 --- a/arm/arm/serial.c +++ b/arm/arm/serial.c @@ -4,7 +4,7 @@ */ #define F_CPU 16000000L -#define BAUD 19200 // for serial 1M +#define BAUD 19200 // for serial 1M #include <avr/io.h> #include <stdio.h> diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index e6f7ac08..88ca984c 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -36,7 +36,8 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 7://Set driving speed set_speed(arg1); break; - case 8: + case 8://Increment servo + break; case 9: break; diff --git a/arm/arm/styrmodul.cproj b/arm/arm/styrmodul.cproj index 22033b1b..c85bf47c 100644 --- a/arm/arm/styrmodul.cproj +++ b/arm/arm/styrmodul.cproj @@ -47,7 +47,7 @@ <InterfaceName>JTAG</InterfaceName> </ToolOptions> <ToolType>com.atmel.avrdbg.tool.atmelice</ToolType> - <ToolNumber>J41800087887</ToolNumber> + <ToolNumber>J41800055572</ToolNumber> <ToolName>Atmel-ICE</ToolName> </com_atmel_avrdbg_tool_atmelice> <avrtoolinterface>JTAG</avrtoolinterface> -- GitLab From 09f78ca52016295a40f0a8c235b4452e2a1895eb Mon Sep 17 00:00:00 2001 From: Jonatan Jonsson <jonjo049@student.liu.se> Date: Mon, 25 Nov 2019 15:45:33 +0100 Subject: [PATCH 02/20] added most of the instructions in the switch case --- arm/arm/arm.c | 69 ++++++++++++++++++++++---------------------- arm/arm/arm.h | 7 ++++- arm/arm/main.c | 61 ++++++++------------------------------- arm/arm/steering.c | 1 + arm/arm/steering.h | 1 + arm/arm/styr_komm.c | 37 +++++++++++++++++------- arm/styrmodul.atsuo | Bin 18432 -> 18944 bytes 7 files changed, 82 insertions(+), 94 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index e3ec121b..eccaafc2 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -4,15 +4,14 @@ * Created: 2019-11-15 14:28:20 * Author: niljo502 */ +#define F_CPU 16000000L #include <avr/io.h> - #include <util/delay.h> #include <stdio.h> #include <string.h> #include "arm.h" -#define F_CPU 16000000L //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { @@ -143,13 +142,6 @@ void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode){ void arm_rotate_90_left(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x00D5,imode); -} - -void lower_arm(){ - - - - } void raise_arm(){ @@ -157,17 +149,30 @@ void raise_arm(){ _delay_ms(5000); move_to_angle(5,0x00FF,0x0330,IMODE_REG_WRITE); move_to_angle(6,0x00FF,0x01FF,IMODE_REG_WRITE); +} + +void lower_arm(){ + move_to_angle(5, 0x00FF, 0x00EF, IMODE_REG_WRITE); //4 straight up + move_to_angle(6, 0x00FF, 0x027F, IMODE_REG_WRITE); //6 out of the way + send_action(); + _delay_ms(7000); //This is not delaying?! + move_to_angle(2, 0x00FF, 0x00EF, IMODE_REG_WRITE); //2 straight up + move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); send_action(); } /** * Moves the servo with the given id to a given goal position with the given speed * Sends an instruction that sets the speed and the goal position with only one package + * If the servo is paired, the instruction is also sent to its paired servo with its corresponding goal position, + * and their instructions are executed simultaneously. + * If servo is paired, the imode is always IMODE_REG_WRITE, and must be followed by a send_action() in order to execute. */ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ if(id == ALL_SERVOS){//Please don't. return; } + uint8_t lower_byte_pos = goal_position& 0xFF; uint8_t higher_byte_pos = goal_position >> 8; @@ -175,35 +180,31 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i uint8_t higher_byte_speed = speed >> 8; uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos, higher_byte_pos, lower_byte_speed, higher_byte_speed}; - send_instruction(id, imode, params, 5); - if (id == 2){//Servo 2 and 3 should always move together - uint16_t goal_position_3 = 0x03FF - goal_position; - uint8_t lower_byte_pos_3 = goal_position_3 & 0xFF; - uint8_t higher_byte_pos_3 = goal_position_3 >> 8; - uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_3, higher_byte_pos_3, lower_byte_speed, higher_byte_speed}; - send_instruction(3, imode, params, 5); - } - else if(id == 3){ - uint16_t goal_position_2 = 0x03FF - goal_position; + if (id == 2 || id == 3 || id == 4 || id == 5){//Servo-pairs (2 and 3) and (4 and 5) should always move together with "opposite" goal_position + send_instruction(id, IMODE_REG_WRITE, params, 5); + uint16_t goal_position_2 = MAX_GOAL_POSITION - goal_position; uint8_t lower_byte_pos_2 = goal_position_2 & 0xFF; uint8_t higher_byte_pos_2 = goal_position_2 >> 8; uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_2, higher_byte_pos_2, lower_byte_speed, higher_byte_speed}; - send_instruction(4, imode, params, 5); - } - if (id == 4){//Servo 4 and 5 should always move together - uint16_t goal_position_5 = 0x03FF - goal_position; - uint8_t lower_byte_pos_5 = goal_position_5 & 0xFF; - uint8_t higher_byte_pos_5 = goal_position_5 >> 8; - uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_5, higher_byte_pos_5, lower_byte_speed, higher_byte_speed}; - send_instruction(5, imode, params, 5); - } - else if(id == 5){ - uint16_t goal_position_4 = 0x03FF - goal_position; - uint8_t lower_byte_pos_4 = goal_position_4 & 0xFF; - uint8_t higher_byte_pos_4 = goal_position_4 >> 8; - uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_4, higher_byte_pos_4, lower_byte_speed, higher_byte_speed}; - send_instruction(4, imode, params, 5); + switch (id) { + case 2: + send_instruction(3, IMODE_REG_WRITE, params, 5); + break; + case 3: + send_instruction(2, IMODE_REG_WRITE, params, 5); + break; + case 4: + send_instruction(5, IMODE_REG_WRITE, params, 5); + break; + case 5: + send_instruction(4, IMODE_REG_WRITE, params, 5); + break; + default: + break; + } + } else { + send_instruction(id, imode, params, 5); } } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 788e29d7..2ead78f9 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -19,7 +19,12 @@ #define MAX_GOAL_POSITION 0x03FF #define MIN_GOAL_POSITION 0x0000 -#define REST_POSITION_SERVO_1 0x01FF +#define REST_POSITION_SERVO_1 0x01FF //Middle position of servo + +//TODO test these positions +#define SERVO_90_RIGHT 205 //Position for 90 degrees to the right +#define SERVO_90_LEFT 818 //Position for 90 degrees to the left + uint8_t get_addr(char name[]); diff --git a/arm/arm/main.c b/arm/arm/main.c index ecacd719..988cd853 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -48,65 +48,28 @@ int main(void){ } // init - //servo_init(); + servo_init(); pwm_init(); - set_return_delay(1,254,IMODE_WRITE); - set_baud_rate(0xFE,103,IMODE_WRITE); - - //set_max_torque(4, 0x300,IMODE_WRITE); - //set_max_torque(5, 0x300,IMODE_WRITE); /************************************************************************/ /* TEST BELOW */ /************************************************************************/ - move_to_angle(1,0x00FF,0x01FF,IMODE_WRITE); - _delay_ms(10000); - arm_rotate_90_left(0x00FF,IMODE_WRITE); - _delay_ms(3000); + //set_return_delay(1,250,IMODE_WRITE); + //arm_rotate_90_left(0x00FF,IMODE_WRITE); + //_delay_ms(5000); //lower_arm(); - move_to_angle(6, 0x00AF, 0x02FF, IMODE_REG_WRITE); - move_to_angle(5, 0x00AF, 0x01FF, IMODE_REG_WRITE); - send_action(); - _delay_ms(5000); - move_to_angle(2, 0x00AF, 0x013F, IMODE_WRITE); - _delay_ms(4000); - raise_arm(); - _delay_ms(5000); - move_to_angle(6, 0x00AF, 0x02FF, IMODE_REG_WRITE); - move_to_angle(5, 0x00AF, 0x01FF, IMODE_REG_WRITE); - send_action(); - _delay_ms(5000); - move_to_angle(2, 0x00AF, 0x013F, IMODE_WRITE); - _delay_ms(4000); - raise_arm(); - _delay_ms(5000); - move_to_angle(1,0x00FF,0x01FF,IMODE_WRITE); + //move_to_angle(); /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ - UCSR1B &= ~(_BV(RXEN1)); - UCSR1B |= _BV(TXEN1); //~(_BV(U2X0)); - ping(1); - DDRD = 0; - UCSR1B &= ~(_BV(TXEN1)); - UCSR1B |= _BV(RXEN1); - - volatile uint8_t b1, b2, b3,b4,b5,b6,b7,b8,b9,b10; - while(1){ - b1 = uart_1_getchar(); - b2 = uart_1_getchar(); - b3 = uart_1_getchar(); - b4 = uart_1_getchar(); - b5 = uart_1_getchar(); - b6 = uart_1_getchar(); - b7 = uart_1_getchar(); - b8 = uart_1_getchar(); - b9 = uart_1_getchar(); - b10 = uart_1_getchar(); - } - - //translate_instruction(b1,b2,b3); + uint8_t b1, b2, b3; + while (true) { + b1 = getchar(); + b2 = getchar(); + b3 = getchar(); + translate_instruction(b1,b2,b3); + } return 0; diff --git a/arm/arm/steering.c b/arm/arm/steering.c index 088ca49f..a0a1dd46 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -21,6 +21,7 @@ uint8_t left_speed = 0; uint8_t default_speed = DEFAULT_SPEED; + enum Direction left_dir;//Current Direction of the left wheel pair enum Direction right_dir; enum Direction DEFAULT_DIR = FORWARD; diff --git a/arm/arm/steering.h b/arm/arm/steering.h index 99d180f2..1b1317dc 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -14,6 +14,7 @@ enum Direction{BACK, FORWARD}; #define DEFAULT_SPEED 100 #define DEFAULT_ROTATE_SPEED 100 +#define TURN_CONSTANT 0.5 #define ROTATE_90_DELAY 2000 #define DRIVE_ONE_BLOCK_DELAY 3400 #define TEST_SPEED 80 diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 88ca984c..08bcfacb 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -11,7 +11,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ switch (instr) { - case 255: + case 255: //Identify putchar(10); break; case 0: //Forward @@ -22,13 +22,21 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ set_direction(BACK); set_speed(arg1); break; - case 2://Turn left + case 2://Turn left (Noting?) + set_right_speed(arg1); + set_left_speed(arg1*TURN_CONSTANT); break; - case 3: //Turn right + case 3: //Turn right (Noting?) break; - case 4: //Rotate left + case 4: //Rotate left + //Setup directions for rotation. Needs a speed to initiate. + set_speed(arg1); + rotate_left(); break; case 5: //Rotate right + //Setup directions for rotation. Needs a speed to initiate. + set_speed(arg1); + rotate_right(); break; case 6://STOP set_speed(0); @@ -36,16 +44,25 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 7://Set driving speed set_speed(arg1); break; - case 8://Increment servo - + case 8: //set angle + set_goal_position(arg1, arg2, IMODE_WRITE); + break; + case 9: //stop servo + break; + case 10: //get angle + break; + case 11: //get temperature break; - case 9: + case 12: //get voltage break; - case 10: + case 13: //set servo speed + set_moving_speed(arg1, arg2, IMODE_WRITE); break; - case 11: + case 50: //rotate 90 left + rotate_90_left(); break; - case 12: + case 51: //rotate 90 right + rotate_right(); break; case 100: // Drive to next node diff --git a/arm/styrmodul.atsuo b/arm/styrmodul.atsuo index 7601e135512345bc9f723d4a6542360f78fd58b3..56034ccee448241927bbaf2a4640c388297356c3 100644 GIT binary patch delta 800 zcma)4T}V@57(U<eJ7>pvR&%o@I&0IToyM?Di$WBSX&|=DrIBEYSV}j6&<KAZCkjOf zx$|^WL>OLFSN)v(TI7}efKeAg7u^)ybu);fX78sBcG(LL-}^rA|I3$NX6c*k@ikeg zlO!qsBzcM1Ji&G&%=da$R+puP)eo$MTxm@6b%m*<Vxuc+dpM?)gf5dEA#9RhgB!>x zuX$b=YpPKp6oEF1DCqdD2KgCLCg@7Ad?vY1A17;q@IbJ4T$P!Dg!hehb>&gb*%SBH z{`AiMxUqnwKjv7PCTj*oQO)gkDR-Y9Btk1DbM67Hx|m3nom8YMV#Mf9t}MVYY4##- zCNS)6!;*0XJL-M7?LF<J%NI*rtrR*awP394u-M%>wyT-3ZcGP`>n7Pd2!#opTp+Eg zVmYclQ`4i1gz}<*>KGY22}0ab>DJ36CSD{D#T{!;M8;_QLEH^ZC}aQncA_sFViGQf z58zX~fo#}P6w3I97qzc&JsPCL+qLhItxMy(H^VMq))>M^uZbDMhfw`3yP=D_MGM*( zsfI;1f}aiR9_Au0OeoCn-yWS9l5?r1#__3f_|0Lsy&dqGK0Grm()-b~|1wUMT6ScL zO*+$&Ikt5rN<w)Z96K79@sh_?ix^vWel@Bx`-+az=g7tvvBqQSdGhECGfh35i!?D< zuBlJ2C&NQ1Oys1Rm()zsg4Ghs48)X&<fD%{#GbZxtC~1MArh&h@3qPz!bx>5aa@U- j6`hltZ?i-F_dm}EmD$0OF9C|eyw#3TfB3%<(yIOf8l4Ha delta 1043 zcmY+@OH30%7zgm#vfY-tm6l*dEoy6NN=5C1L~LwqMG;FQ7&Mwt6vS6dC|IgeKxq}9 zph7<{CZM7SCzZG{L{21d@EOtI(Sz}3qNgTCW6=LLsCAm(&dm2sXJ;of@f%#cj~lzB zkcK@WuD{-x<bzy3nfMjjzA<H;eds-x#ZV~5zo04Jnbh*srVNTI#O&}3h2HWON-1CQ zA$j1mV9C3R#vC%<`TDw?_$e59IY>rTu%vcAQ-^vV?1y@2fCJD7O>hVfL;8;cs{BwG zon~l(;}C&Xh{6dt38$b9V$cp9&<UsE40J&p1}n3_d>9H>QEI|6`uV{l>K7f7Ppwwa zGj}mXHPxaGqqOkvGc~)^OEUw}1yx#3K*W?0l~M}~Jbkm(P=$6iz0u{;YW;4iFIq@D zEa#-SzB?<+haK6uYLisH$i;C%iWw?JHD*}&-z<i>AnZZJz)^caK$KUZ&lr&BKu065 zPp%n{RyL!YZKaZLxn1EdL9~PUnTwUPt!zCj!PCjsu+8bV8!ab(TbKhae>&%<!Iek2 z!&umM3Yg5)Vk*{sjLzLH8=uiXT*~e|&-pclvyn%WCLet@zaxWrf<#egVJv-0SfnY` z5NTT5*b-?z*16XcDr-IwX+6{$aygtEXmVAYJ4(jFO8R68Kq)QJ=hBhFn@L+fHfvqd zx<!<ySqy(SJZkOcX6d^Xr*E;B$Y!B@TaYxm9W-w9(QCh(dUQ)DP;`<6voC3H<2t37 zy^B*F#3U$`$nK(Wu}Cv!qcl=npwM#55LUpSR|r0IhB@iST0ueal3Hsc%lh2&WVH79 z%hHOcloPJ;$g7fvXBJ90r$io!!uh0p4FvhM2}bR%08P6clyX&z7KD@;W2C6NSMVkf zISc2Y8_vT8xCocvGF*Wk=!F5e2J%IiBd^C@G>G0UxD9t;2=2l?7>4^W0;AH9XFsmC c`timJL2X1t{*3gcjc%S*Ycc{-w5*r^4W7e6A^-pY -- GitLab From 011dda926d71000102b7455a2c6a4d06011dfedd Mon Sep 17 00:00:00 2001 From: Jonatan Jonsson <jonjo049@student.liu.se> Date: Mon, 25 Nov 2019 17:22:01 +0100 Subject: [PATCH 03/20] Added some docmentation and tried to rework uart commuincation for the arm --- arm/arm/arm.c | 6 ++++++ arm/arm/arm.h | 1 + arm/arm/serial.c | 11 ++++++++++- arm/arm/styr_komm.c | 27 +++++++++++++++++++++++++++ arm/styrmodul.atsuo | Bin 18944 -> 18944 bytes 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index eccaafc2..c062b9e1 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -71,6 +71,7 @@ const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { /** * Sets the position limits for all servos */ + servo_init(){ set_cw_limit(1,0x0000,IMODE_WRITE); set_ccw_limit(1,0x03FF,IMODE_WRITE); @@ -144,6 +145,11 @@ void arm_rotate_90_left(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x00D5,imode); } +void arm_rotate_90_right(uint16_t speed,uint8_t imode){ + // TODO write function + //move_to_angle(1, speed, 0x00D5,imode); +} + void raise_arm(){ move_to_angle(2,0x00FF,0x031F,IMODE_WRITE); _delay_ms(5000); diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 2ead78f9..4aab18be 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -10,6 +10,7 @@ #define INSTRUCTION_SET_LENGTH 49 #define ALL_SERVOS 0xFE //ID for calling all servos +#define CLAW_ID 8 // TODO check id of claw #define IMODE_READ 2 #define IMODE_WRITE 3 diff --git a/arm/arm/serial.c b/arm/arm/serial.c index 52ef7ee5..70ab0b44 100644 --- a/arm/arm/serial.c +++ b/arm/arm/serial.c @@ -24,8 +24,17 @@ char uart_0_getchar(FILE *stream){ } void uart_1_putchar(char c){ - loop_until_bit_is_set(UCSR1A, UDRE1); + loop_until_bit_is_set(UCSR1A, UDRE1);//Wait until data register is empty and ready to receive new data + DDRD = 1; //Enable output, disable input + UCSR1B &= ~(_BV(RXEN1)); + UCSR1B |= _BV(TXEN1); + UDR1 = c; + loop_until_bit_is_set(UCSR1A, TXC1);// Wait until transmission of data is complete + + DDRD = 0;//Disable output, enable input + UCSR1B &= ~(_BV(TXEN1)); + UCSR1B |= _BV(RXEN1); } char uart_1_getchar(){ diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 08bcfacb..4e4c95f3 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -9,6 +9,14 @@ #include "steering.h" #include "arm.h" +/** + * Executes an instruction according to the given instruction number and the given arguments + * + * param instr: instruction number used to identify the instruction + * param arg1: first argument to instruction + * param arg2: second argument to instruction + * + */ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ switch (instr) { case 255: //Identify @@ -58,6 +66,25 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 13: //set servo speed set_moving_speed(arg1, arg2, IMODE_WRITE); break; + case 15: //open claw + move_to_angle(CLAW_ID, arg1, 512, IMODE_WRITE); //TODO check if CLAW_ID and given goal_position is right + break; + case 16: //close claw + move_to_angle(CLAW_ID, arg1, 0, IMODE_WRITE);//TODO check if CLAW_ID and given goal_position is right + break; + case 17: // rotate arm left + break; + case 18: //rotate arm right + break; + case 19: //arm down + break; + case 20://arm up + break; + case 21: //arm forward + break; + case 22: //arm backward + break; + case 50: //rotate 90 left rotate_90_left(); break; diff --git a/arm/styrmodul.atsuo b/arm/styrmodul.atsuo index 56034ccee448241927bbaf2a4640c388297356c3..f3471f7490a994cdc823ed8114541c2524254a5d 100644 GIT binary patch delta 184 zcmZpe!q_l{aYHT(OG$~qg3X02znK_gCNH#7o;-n_NAN!q$Yx+*$N|a(Z{l!fntYhW zaB~Tlj}oKLWDZfQ$qtGfdWj5047m(?3>geRL<`dOc>5WDO@2R3cAkg?BTy@nNnqw? wLtP<OUPcz6lqytu@<kSv$t6bqAj4Usfr5pTe;Rr7r~p~KNJ=)B825+)0661JTmS$7 delta 165 zcmZpe!q_l{aYHT(%i;+P&6^8Zelty8VWl#80y~dj1_J{_CJ_Jo|NnnBkj|OB&?<Nn zhcgo|BT(eO3Q!0{Prk^avbluIM@cl9p@hMRL60Gop#q3`8MuHd7$zqwYfpY?t1&s> wU4L`9?i-fLhgl3Kml*l8GO~cAFS_WkrUMzhlYbg{^QZz@yg-aF*tkaw0ADyZ*8l(j -- GitLab From a75cac370acbbcdb3874a8c1fd18632f19392135 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Wed, 27 Nov 2019 11:49:31 +0100 Subject: [PATCH 04/20] Added a new instruction and worked more on the arm --- arm/arm/arm.c | 32 +++++++++++++++++++------------- arm/arm/arm.h | 6 ++++-- arm/arm/main.c | 27 +++++++++++++++++++++++---- arm/arm/serial.c | 8 +++++--- arm/arm/steering.c | 7 +++++++ arm/arm/steering.h | 1 + arm/arm/styr_komm.c | 9 +++++++++ 7 files changed, 68 insertions(+), 22 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index c062b9e1..64fc7ceb 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -12,6 +12,7 @@ #include <string.h> #include "arm.h" +#include "serial.h" //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { @@ -72,7 +73,7 @@ const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { * Sets the position limits for all servos */ -servo_init(){ +void servo_init(){ set_cw_limit(1,0x0000,IMODE_WRITE); set_ccw_limit(1,0x03FF,IMODE_WRITE); _delay_ms(100); @@ -141,15 +142,6 @@ void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode){ write_two_bytes(id, "Baud Rate", baud_rate, 1, imode); } -void arm_rotate_90_left(uint16_t speed,uint8_t imode){ - move_to_angle(1, speed, 0x00D5,imode); -} - -void arm_rotate_90_right(uint16_t speed,uint8_t imode){ - // TODO write function - //move_to_angle(1, speed, 0x00D5,imode); -} - void raise_arm(){ move_to_angle(2,0x00FF,0x031F,IMODE_WRITE); _delay_ms(5000); @@ -158,13 +150,15 @@ void raise_arm(){ } void lower_arm(){ - move_to_angle(5, 0x00FF, 0x00EF, IMODE_REG_WRITE); //4 straight up +/* + move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); //4 straight up move_to_angle(6, 0x00FF, 0x027F, IMODE_REG_WRITE); //6 out of the way send_action(); _delay_ms(7000); //This is not delaying?! move_to_angle(2, 0x00FF, 0x00EF, IMODE_REG_WRITE); //2 straight up move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); send_action(); +*/ } /** @@ -176,6 +170,7 @@ void lower_arm(){ */ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ if(id == ALL_SERVOS){//Please don't. + int test = 12; return; } @@ -214,6 +209,17 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i } } + +void arm_rotate_90_left(uint16_t speed,uint8_t imode){ + move_to_angle(1, speed, 0x00D5,imode); +} + +void arm_rotate_90_right(uint16_t speed,uint8_t imode){ + // TODO write function + move_to_angle(1, speed, 0x02FF,imode); +} + + /** * Set counter clockwise limit for servo position */ @@ -285,8 +291,8 @@ void ping(uint8_t id) { uart_1_putchar(id); //ID uart_1_putchar(2); //LEN uart_1_putchar(1); //INST - uart_1_putchar(0xFB); - //uart_1_putchar(0xFF - (id + 2 + 1)); //Checksum calculation + //uart_1_putchar(0xFB); + uart_1_putchar(0xFF - (id + 2 + 1)); //Checksum calculation } /** diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 4aab18be..768c58ad 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -64,10 +64,12 @@ void write_two_bytes(uint8_t id, char *name, uint16_t arg, uint8_t param_len, ui /* Sends an instruction to any servo. */ void send_instruction(uint8_t id, uint8_t imode, uint8_t *params, uint8_t param_len); -void arm_rotate_90_left(uint16_t speed,uint8_t imode); void set_return_delay(uint8_t id, uint16_t delay, uint8_t imode); void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode); void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode); void raise_arm(); +void lower_arm(); +void arm_rotate_90_right(uint16_t speed,uint8_t imode); +void arm_rotate_90_left(uint16_t speed,uint8_t imode); -#endif ARM_H_ \ No newline at end of file +#endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 988cd853..45ffcbba 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -49,7 +49,6 @@ int main(void){ // init servo_init(); - pwm_init(); /************************************************************************/ /* TEST BELOW */ @@ -59,18 +58,37 @@ int main(void){ //_delay_ms(5000); //lower_arm(); //move_to_angle(); + /*ping(7); + b1 = uart_1_getchar(); + b2 = uart_1_getchar(); + b3 = uart_1_getchar(); + b4 = uart_1_getchar(); + b5 = uart_1_getchar(); + b6 = uart_1_getchar(); + */ /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ - uint8_t b1, b2, b3; - + volatile uint8_t b1, b2, b3,b4,b5,b6,b7,b8; + move_to_angle(6, 0x00FF, 0x02FF,IMODE_REG_WRITE); + _delay_ms(5000); + send_action(); +/* move_to_angle(3, 0x00FF, 358, IMODE_WRITE); + send_action(); + _delay_ms(6000); + move_to_angle(3, 0x00FF,205,IMODE_WRITE); + send_action(); +*/ +// lower_arm(); + /* while (true) { b1 = getchar(); b2 = getchar(); b3 = getchar(); translate_instruction(b1,b2,b3); } - + */ + return 0; } @@ -81,6 +99,7 @@ bool cold(){ // Initializes serial communication. uart_init(); uart_arm_init(); + pwm_init(); stdout = &uart_output; stdin = &uart_input; diff --git a/arm/arm/serial.c b/arm/arm/serial.c index 70ab0b44..477ab851 100644 --- a/arm/arm/serial.c +++ b/arm/arm/serial.c @@ -24,17 +24,19 @@ char uart_0_getchar(FILE *stream){ } void uart_1_putchar(char c){ - loop_until_bit_is_set(UCSR1A, UDRE1);//Wait until data register is empty and ready to receive new data + /*loop_until_bit_is_set(UCSR1A, UDRE1);//Wait until data register is empty and ready to receive new data DDRD = 1; //Enable output, disable input UCSR1B &= ~(_BV(RXEN1)); UCSR1B |= _BV(TXEN1); - + */ + loop_until_bit_is_set(UCSR1A, UDRE1); UDR1 = c; +/* loop_until_bit_is_set(UCSR1A, TXC1);// Wait until transmission of data is complete - DDRD = 0;//Disable output, enable input UCSR1B &= ~(_BV(TXEN1)); UCSR1B |= _BV(RXEN1); +*/ } char uart_1_getchar(){ diff --git a/arm/arm/steering.c b/arm/arm/steering.c index a0a1dd46..34f5e973 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -184,4 +184,11 @@ void back_one_block(){ set_speed(DEFAULT_SPEED); _delay_ms(DRIVE_ONE_BLOCK_DELAY); set_direction(FORWARD); +} + +void small_forward(){ + set_direction(FORWARD); + set_speed(DEFAULT_SPEED); + _delay_ms(1000); + set_speed(0); } \ No newline at end of file diff --git a/arm/arm/steering.h b/arm/arm/steering.h index 1b1317dc..2f79d689 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -43,6 +43,7 @@ void rotate_90_right(); void drive_one_block(); void back_one_block(); void set_default_speed(uint8_t duty_threshold); +void small_forward(); #endif diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 4e4c95f3..e302ff32 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -35,6 +35,8 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ set_left_speed(arg1*TURN_CONSTANT); break; case 3: //Turn right (Noting?) + set_right_speed(arg1*TURN_CONSTANT); + set_left_speed(arg1); break; case 4: //Rotate left //Setup directions for rotation. Needs a speed to initiate. @@ -73,12 +75,16 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ move_to_angle(CLAW_ID, arg1, 0, IMODE_WRITE);//TODO check if CLAW_ID and given goal_position is right break; case 17: // rotate arm left + arm_rotate_90_left(arg1,IMODE_WRITE); break; case 18: //rotate arm right + arm_rotate_90_right(arg1,IMODE_WRITE); break; case 19: //arm down + lower_arm(); break; case 20://arm up + //raise_arm(); break; case 21: //arm forward break; @@ -91,6 +97,9 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 51: //rotate 90 right rotate_right(); break; + case 52: //Small forward + small_forward(); + break; case 100: // Drive to next node break; -- GitLab From 148e2b77f726dd519ba3ceed743a36e2c6b05cf5 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Thu, 28 Nov 2019 12:11:35 +0100 Subject: [PATCH 05/20] Implemented working lower arm instruction --- arm/arm/arm.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 64fc7ceb..44600342 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -150,15 +150,27 @@ void raise_arm(){ } void lower_arm(){ -/* - move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); //4 straight up - move_to_angle(6, 0x00FF, 0x027F, IMODE_REG_WRITE); //6 out of the way + move_to_angle(1, 0x00FF, 818,IMODE_WRITE); + move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); + _delay_ms(2000); + + move_to_angle(4, 0x00FF, 300, IMODE_REG_WRITE); + send_action(); + _delay_ms(2000); + + move_to_angle(3, 0x00FF, 550, IMODE_REG_WRITE); + send_action(); + _delay_ms(2000); + + move_to_angle(4, 0x00FF, 0x0340, IMODE_REG_WRITE); + move_to_angle(3, 0x00A0, 800, IMODE_REG_WRITE); + move_to_angle(8,0x00FF,0x01FF,IMODE_REG_WRITE); send_action(); - _delay_ms(7000); //This is not delaying?! - move_to_angle(2, 0x00FF, 0x00EF, IMODE_REG_WRITE); //2 straight up - move_to_angle(5, 0x00FF, 0x01FF, IMODE_REG_WRITE); + _delay_ms(1000); + + move_to_angle(6, 0x00FF, 0x01FF,IMODE_REG_WRITE); + move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE); send_action(); -*/ } /** @@ -184,6 +196,7 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i if (id == 2 || id == 3 || id == 4 || id == 5){//Servo-pairs (2 and 3) and (4 and 5) should always move together with "opposite" goal_position send_instruction(id, IMODE_REG_WRITE, params, 5); + _delay_ms(200); uint16_t goal_position_2 = MAX_GOAL_POSITION - goal_position; uint8_t lower_byte_pos_2 = goal_position_2 & 0xFF; uint8_t higher_byte_pos_2 = goal_position_2 >> 8; -- GitLab From 89c0014af6a569a8d9734f121dde64b5fc5cba68 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Thu, 28 Nov 2019 12:49:29 +0100 Subject: [PATCH 06/20] Implemented raise arm instruction --- arm/arm/arm.c | 21 +++++++++++++++++---- arm/arm/arm.h | 1 + arm/arm/styr_komm.c | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 44600342..547a8a10 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -142,14 +142,27 @@ void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode){ write_two_bytes(id, "Baud Rate", baud_rate, 1, imode); } +//Enable or disable torque for a servo with the given id +void torque_enable(uint8_t id, uint16_t enable, uint8_t imode){ + write_two_bytes(id,"Torque Enable", enable, 1, imode); +} + void raise_arm(){ - move_to_angle(2,0x00FF,0x031F,IMODE_WRITE); - _delay_ms(5000); - move_to_angle(5,0x00FF,0x0330,IMODE_REG_WRITE); - move_to_angle(6,0x00FF,0x01FF,IMODE_REG_WRITE); + move_to_angle(2,0x00AF,0x031F,IMODE_REG_WRITE); + move_to_angle(5,0x00AF,0x0300,IMODE_REG_WRITE); + move_to_angle(6,0x00AF,0x01AF,IMODE_REG_WRITE); + _delay_ms(2000); + send_action(); + _delay_ms(2000); + torque_enable(2,0,IMODE_WRITE);//Disable servos 2 and 3 since they don't need to work + torque_enable(3,0,IMODE_WRITE); + } void lower_arm(){ + torque_enable(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called + torque_enable(3,1,IMODE_WRITE);//we have to make sure that they are enabled here + _delay_ms(200); move_to_angle(1, 0x00FF, 818,IMODE_WRITE); move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); _delay_ms(2000); diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 768c58ad..1c3c9781 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -71,5 +71,6 @@ void raise_arm(); void lower_arm(); void arm_rotate_90_right(uint16_t speed,uint8_t imode); void arm_rotate_90_left(uint16_t speed,uint8_t imode); +void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index e302ff32..557030af 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -84,7 +84,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ lower_arm(); break; case 20://arm up - //raise_arm(); + raise_arm(); break; case 21: //arm forward break; -- GitLab From ff70a8baf6eeedc086f816573bab3d2d80ea679e Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Thu, 28 Nov 2019 16:16:06 +0100 Subject: [PATCH 07/20] wrote functionality for moving the arm slightly forward/backward when the arm is lowered. Doesnt seem to really work because the servos are weak? --- arm/arm/arm.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++---- arm/arm/arm.h | 8 ++++++ 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 547a8a10..fb63da0a 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -14,6 +14,10 @@ #include "arm.h" #include "serial.h" +uint16_t servo_6_pos; +uint16_t servo_4_pos; +uint8_t arm_forward_callable = 0; //1 if instruction arm_forward should be callable 0 if not + //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { "Model Number", @@ -156,6 +160,7 @@ void raise_arm(){ _delay_ms(2000); torque_enable(2,0,IMODE_WRITE);//Disable servos 2 and 3 since they don't need to work torque_enable(3,0,IMODE_WRITE); + arm_forward_callable = 0; } @@ -163,7 +168,7 @@ void lower_arm(){ torque_enable(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called torque_enable(3,1,IMODE_WRITE);//we have to make sure that they are enabled here _delay_ms(200); - move_to_angle(1, 0x00FF, 818,IMODE_WRITE); + move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); _delay_ms(2000); @@ -175,17 +180,75 @@ void lower_arm(){ send_action(); _delay_ms(2000); - move_to_angle(4, 0x00FF, 0x0340, IMODE_REG_WRITE); + move_to_angle(4, 0x00FF, 700, IMODE_REG_WRITE); move_to_angle(3, 0x00A0, 800, IMODE_REG_WRITE); move_to_angle(8,0x00FF,0x01FF,IMODE_REG_WRITE); send_action(); _delay_ms(1000); - move_to_angle(6, 0x00FF, 0x01FF,IMODE_REG_WRITE); + move_to_angle(6, 0x00FF, 640,IMODE_REG_WRITE); move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE); send_action(); + torque_enable(2,0,IMODE_WRITE); + torque_enable(3,0,IMODE_WRITE); + servo_4_pos = 700; + servo_6_pos = 640; + arm_forward_callable = 1; +} + +/** + * Move arm slightly forward. Meant to be used after lower_arm() has been called! + * Do not call the function if the arm has not been lowered!! + */ +void arm_forward(){ + + if( (servo_6_pos-15) > servo_6_pos || (servo_6_pos-15) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached + servo_6_pos = SERVO_6_LOWER_LIMIT; + } + else{ + servo_6_pos = servo_6_pos - 20; + } + + if( (servo_4_pos+40) < servo_4_pos || servo_4_pos+40 >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached + servo_4_pos = SERVO_4_UPPER_LIMIT; + } + else{ + servo_4_pos = servo_4_pos + 40; + } + + move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); + _delay_ms(200); + move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + send_action(); } +/** + * Move arm slightly backward. Meant to be used after lower_arm() has been called! + * Do not call the function if the arm has not been lowered!! + */ +void arm_backward(){ + + if( (servo_6_pos+20) < servo_6_pos || (servo_6_pos+20) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached + servo_6_pos = SERVO_6_UPPER_LIMIT; + } + else{ + servo_6_pos = servo_6_pos + 20; + } + + if( (servo_4_pos-40) > servo_4_pos || servo_4_pos-40 <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached + servo_4_pos = SERVO_4_LOWER_LIMIT; + } + else{ + servo_4_pos = servo_4_pos - 40; + } + + move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); + _delay_ms(200); + move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + send_action(); +} + + /** * Moves the servo with the given id to a given goal position with the given speed * Sends an instruction that sets the speed and the goal position with only one package @@ -241,8 +304,7 @@ void arm_rotate_90_left(uint16_t speed,uint8_t imode){ } void arm_rotate_90_right(uint16_t speed,uint8_t imode){ - // TODO write function - move_to_angle(1, speed, 0x02FF,imode); + move_to_angle(1, speed, 0x0332,imode); } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 1c3c9781..7ae85a19 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -20,6 +20,12 @@ #define MAX_GOAL_POSITION 0x03FF #define MIN_GOAL_POSITION 0x0000 +#define SERVO_6_UPPER_LIMIT 0x0330 +#define SERVO_6_LOWER_LIMIT 0x00FF + +#define SERVO_4_UPPER_LIMIT 0x03FF +#define SERVO_4_LOWER_LIMIT 0x0000 + #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo //TODO test these positions @@ -72,5 +78,7 @@ void lower_arm(); void arm_rotate_90_right(uint16_t speed,uint8_t imode); void arm_rotate_90_left(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); +void arm_forward(); +void arm_backward(); #endif // ARM_H_ \ No newline at end of file -- GitLab From 281c739784405726493bb37a63af94ad38b97294 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 29 Nov 2019 11:15:50 +0100 Subject: [PATCH 08/20] Fine tuned arm functions --- arm/arm/arm.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index fb63da0a..0b9361a3 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -16,6 +16,8 @@ uint16_t servo_6_pos; uint16_t servo_4_pos; +uint16_t servo_3_pos; + uint8_t arm_forward_callable = 0; //1 if instruction arm_forward should be callable 0 if not //Array of instruction names. The index of the instruction string is the address of the instruction. @@ -154,7 +156,7 @@ void torque_enable(uint8_t id, uint16_t enable, uint8_t imode){ void raise_arm(){ move_to_angle(2,0x00AF,0x031F,IMODE_REG_WRITE); move_to_angle(5,0x00AF,0x0300,IMODE_REG_WRITE); - move_to_angle(6,0x00AF,0x01AF,IMODE_REG_WRITE); + move_to_angle(6,0x00AF,0x03FF,IMODE_REG_WRITE); _delay_ms(2000); send_action(); _delay_ms(2000); @@ -180,19 +182,22 @@ void lower_arm(){ send_action(); _delay_ms(2000); - move_to_angle(4, 0x00FF, 700, IMODE_REG_WRITE); - move_to_angle(3, 0x00A0, 800, IMODE_REG_WRITE); + move_to_angle(4, 0x00FF, 400, IMODE_REG_WRITE); + move_to_angle(3, 0x00A0, 700, IMODE_REG_WRITE); move_to_angle(8,0x00FF,0x01FF,IMODE_REG_WRITE); send_action(); _delay_ms(1000); - move_to_angle(6, 0x00FF, 640,IMODE_REG_WRITE); - move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE); + move_to_angle(6, 0x00FF, 818,IMODE_REG_WRITE); + move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE);//Open claw send_action(); - torque_enable(2,0,IMODE_WRITE); - torque_enable(3,0,IMODE_WRITE); - servo_4_pos = 700; - servo_6_pos = 640; + //torque_enable(2,0,IMODE_WRITE);//Relax servo 2 and 3 since they don't need to work in this position + //torque_enable(3,0,IMODE_WRITE); + + servo_3_pos = 700; + servo_4_pos = 400; + servo_6_pos = 818; + arm_forward_callable = 1; } @@ -202,23 +207,23 @@ void lower_arm(){ */ void arm_forward(){ - if( (servo_6_pos-15) > servo_6_pos || (servo_6_pos-15) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached + if( (servo_6_pos-20) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached servo_6_pos = SERVO_6_LOWER_LIMIT; } else{ servo_6_pos = servo_6_pos - 20; } - if( (servo_4_pos+40) < servo_4_pos || servo_4_pos+40 >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached + if( (servo_4_pos+20) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached servo_4_pos = SERVO_4_UPPER_LIMIT; } else{ - servo_4_pos = servo_4_pos + 40; + servo_4_pos = servo_4_pos + 20; } move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); - _delay_ms(200); move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + _delay_ms(100); send_action(); } @@ -228,23 +233,23 @@ void arm_forward(){ */ void arm_backward(){ - if( (servo_6_pos+20) < servo_6_pos || (servo_6_pos+20) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached + if( (servo_6_pos+20) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached servo_6_pos = SERVO_6_UPPER_LIMIT; } else{ servo_6_pos = servo_6_pos + 20; } - if( (servo_4_pos-40) > servo_4_pos || servo_4_pos-40 <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached + if( servo_4_pos-20 <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached servo_4_pos = SERVO_4_LOWER_LIMIT; } else{ - servo_4_pos = servo_4_pos - 40; + servo_4_pos = servo_4_pos - 20; } - + move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); - _delay_ms(200); move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + _delay_ms(100); send_action(); } -- GitLab From 82af726e31add149733b6a905e231cd2e4d9b620 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 29 Nov 2019 11:53:19 +0100 Subject: [PATCH 09/20] Cleaned up the code --- arm/arm/arm.c | 32 ++++++++++++++++---------------- arm/arm/arm.h | 2 ++ arm/arm/main.c | 34 ++++++++-------------------------- arm/arm/serial.c | 11 ----------- arm/arm/styr_komm.c | 13 ++++++++----- arm/arm/styrmodul.cproj | 2 +- arm/styrmodul.atsuo | Bin 18944 -> 19456 bytes 7 files changed, 35 insertions(+), 59 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 0b9361a3..2e1e4841 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -78,7 +78,6 @@ const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { /** * Sets the position limits for all servos */ - void servo_init(){ set_cw_limit(1,0x0000,IMODE_WRITE); set_ccw_limit(1,0x03FF,IMODE_WRITE); @@ -115,7 +114,7 @@ uint8_t get_addr(char name[]){ return i; } } - return 254; + return 254;//Name not found } void set_led(uint8_t id, uint16_t led_value, uint8_t imode){ @@ -168,7 +167,7 @@ void raise_arm(){ void lower_arm(){ torque_enable(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called - torque_enable(3,1,IMODE_WRITE);//we have to make sure that they are enabled here + torque_enable(3,1,IMODE_WRITE);//we make sure that they are enabled here _delay_ms(200); move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); @@ -191,8 +190,6 @@ void lower_arm(){ move_to_angle(6, 0x00FF, 818,IMODE_REG_WRITE); move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE);//Open claw send_action(); - //torque_enable(2,0,IMODE_WRITE);//Relax servo 2 and 3 since they don't need to work in this position - //torque_enable(3,0,IMODE_WRITE); servo_3_pos = 700; servo_4_pos = 400; @@ -206,19 +203,22 @@ void lower_arm(){ * Do not call the function if the arm has not been lowered!! */ void arm_forward(){ + if(arm_forward_callable != 1){ + return; + } - if( (servo_6_pos-20) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached + if( (servo_6_pos-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached servo_6_pos = SERVO_6_LOWER_LIMIT; } else{ - servo_6_pos = servo_6_pos - 20; + servo_6_pos = servo_6_pos - ARM_FORWARD_DELTA; } - if( (servo_4_pos+20) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached + if( (servo_4_pos+ARM_FORWARD_DELTA) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached servo_4_pos = SERVO_4_UPPER_LIMIT; } else{ - servo_4_pos = servo_4_pos + 20; + servo_4_pos = servo_4_pos + ARM_FORWARD_DELTA; } move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); @@ -232,19 +232,22 @@ void arm_forward(){ * Do not call the function if the arm has not been lowered!! */ void arm_backward(){ + if(arm_forward_callable != 1){ + return; + } - if( (servo_6_pos+20) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached + if( (servo_6_pos+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached servo_6_pos = SERVO_6_UPPER_LIMIT; } else{ - servo_6_pos = servo_6_pos + 20; + servo_6_pos = servo_6_pos + ARM_FORWARD_DELTA; } - if( servo_4_pos-20 <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached + if( servo_4_pos-ARM_FORWARD_DELTA <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached servo_4_pos = SERVO_4_LOWER_LIMIT; } else{ - servo_4_pos = servo_4_pos - 20; + servo_4_pos = servo_4_pos - ARM_FORWARD_DELTA; } move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); @@ -263,7 +266,6 @@ void arm_backward(){ */ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ if(id == ALL_SERVOS){//Please don't. - int test = 12; return; } @@ -303,7 +305,6 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i } } - void arm_rotate_90_left(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x00D5,imode); } @@ -312,7 +313,6 @@ void arm_rotate_90_right(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x0332,imode); } - /** * Set counter clockwise limit for servo position */ diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 7ae85a19..2e35c599 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -26,6 +26,8 @@ #define SERVO_4_UPPER_LIMIT 0x03FF #define SERVO_4_LOWER_LIMIT 0x0000 +#define ARM_FORWARD_DELTA 20 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled + #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo //TODO test these positions diff --git a/arm/arm/main.c b/arm/arm/main.c index 45ffcbba..56d7d201 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -53,41 +53,23 @@ int main(void){ /************************************************************************/ /* TEST BELOW */ /************************************************************************/ - //set_return_delay(1,250,IMODE_WRITE); - //arm_rotate_90_left(0x00FF,IMODE_WRITE); - //_delay_ms(5000); - //lower_arm(); - //move_to_angle(); - /*ping(7); - b1 = uart_1_getchar(); - b2 = uart_1_getchar(); - b3 = uart_1_getchar(); - b4 = uart_1_getchar(); - b5 = uart_1_getchar(); - b6 = uart_1_getchar(); - */ + /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ - volatile uint8_t b1, b2, b3,b4,b5,b6,b7,b8; - move_to_angle(6, 0x00FF, 0x02FF,IMODE_REG_WRITE); - _delay_ms(5000); - send_action(); -/* move_to_angle(3, 0x00FF, 358, IMODE_WRITE); - send_action(); - _delay_ms(6000); - move_to_angle(3, 0x00FF,205,IMODE_WRITE); - send_action(); -*/ -// lower_arm(); - /* + + + + uint8_t b1, b2, b3,b4,b5,b6,b7,b8; + + while (true) { b1 = getchar(); b2 = getchar(); b3 = getchar(); translate_instruction(b1,b2,b3); } - */ + return 0; diff --git a/arm/arm/serial.c b/arm/arm/serial.c index 477ab851..52ef7ee5 100644 --- a/arm/arm/serial.c +++ b/arm/arm/serial.c @@ -24,19 +24,8 @@ char uart_0_getchar(FILE *stream){ } void uart_1_putchar(char c){ - /*loop_until_bit_is_set(UCSR1A, UDRE1);//Wait until data register is empty and ready to receive new data - DDRD = 1; //Enable output, disable input - UCSR1B &= ~(_BV(RXEN1)); - UCSR1B |= _BV(TXEN1); - */ loop_until_bit_is_set(UCSR1A, UDRE1); UDR1 = c; -/* - loop_until_bit_is_set(UCSR1A, TXC1);// Wait until transmission of data is complete - DDRD = 0;//Disable output, enable input - UCSR1B &= ~(_BV(TXEN1)); - UCSR1B |= _BV(RXEN1); -*/ } char uart_1_getchar(){ diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 557030af..6ca197b1 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -55,9 +55,11 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ set_speed(arg1); break; case 8: //set angle - set_goal_position(arg1, arg2, IMODE_WRITE); + move_to_angle(arg1, 0x00FF, arg2, IMODE_REG_WRITE);//arg1 is id arg2 is goal_position + send_action();//Always send_action since we might call a pair of servos break; case 9: //stop servo + torque_enable(arg1,0,IMODE_WRITE); break; case 10: //get angle break; @@ -69,11 +71,11 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ set_moving_speed(arg1, arg2, IMODE_WRITE); break; case 15: //open claw - move_to_angle(CLAW_ID, arg1, 512, IMODE_WRITE); //TODO check if CLAW_ID and given goal_position is right + move_to_angle(CLAW_ID, arg1, 512, IMODE_WRITE); break; case 16: //close claw - move_to_angle(CLAW_ID, arg1, 0, IMODE_WRITE);//TODO check if CLAW_ID and given goal_position is right - break; + move_to_angle(CLAW_ID, arg1, 0, IMODE_WRITE);//Right now the claw will close fully, we probably + break; //want it to close halway or something case 17: // rotate arm left arm_rotate_90_left(arg1,IMODE_WRITE); break; @@ -87,10 +89,11 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ raise_arm(); break; case 21: //arm forward + arm_forward(); break; case 22: //arm backward + arm_backward(); break; - case 50: //rotate 90 left rotate_90_left(); break; diff --git a/arm/arm/styrmodul.cproj b/arm/arm/styrmodul.cproj index c85bf47c..22033b1b 100644 --- a/arm/arm/styrmodul.cproj +++ b/arm/arm/styrmodul.cproj @@ -47,7 +47,7 @@ <InterfaceName>JTAG</InterfaceName> </ToolOptions> <ToolType>com.atmel.avrdbg.tool.atmelice</ToolType> - <ToolNumber>J41800055572</ToolNumber> + <ToolNumber>J41800087887</ToolNumber> <ToolName>Atmel-ICE</ToolName> </com_atmel_avrdbg_tool_atmelice> <avrtoolinterface>JTAG</avrtoolinterface> diff --git a/arm/styrmodul.atsuo b/arm/styrmodul.atsuo index f3471f7490a994cdc823ed8114541c2524254a5d..53f225e5c900616c47292033fad217f556bf0195 100644 GIT binary patch delta 3082 zcmb`JdraHc6~})+V}lJg#XJlc62dT)m(9;_JK^CckkF12vUM9t7h_D~f^lk08wV4d zELk6Ev)Ly~v!qFB*R0#RR-3G;ou;i+5N&I^DU~*9TB}u6rK(b;Nt4(g(YCPfH8wLP zo%TnM_3^#;+;bnlbMHO(CNA)aOZ-n0BBh4oxG#YwaA$pe{Z2Y5`X$fTQ=_<{^wwXm zG^}6$6JLPJ<qkR_ep?Qcbyj34y(`wF6k<9q8KM=jp4KGqh`)(CS}oL6ek<EyPc}Wv zD*jb?kUvCUFREL7D62k<)Cb0a9~=PzFbRGLj)EWvfhoY|_+6wkAPkOyM?eJ3f+&~+ zkAla*aS#J1z&wb91&-UnokV64B*4X2|K0WeiM>PTF1`Qhjgw7}Q&KLFL;7Il^<OvL z_mb)f%gd)H_y62bc)bY5bjndh%cx9+KY8@iz17}pio|>WcsKYPQMNMekQML>p4m2o zoTn&SJgmr+6#3dUrj<dX&eujuh827VG>v)M^jb-hCvEd?DlT)TN>>y-Te+${3tB6E zfL6r<Meli<mYohdS5`|$n)g$O@+)+>t(3m3iKG+CGX(_>e8@;sU%J1_!1MP}Of@8z zqNCEh&eChD;R3d>>8SbuFD=fiqP4nPnXOQ=MOlAKUJHdXPgy0Pa7K<lNHKR3IT`mX zl?@mqv(Z>2ly>ZF7a2{coadaJf$QhIoRu@-U(abdS0-;nPLH356OeOe>YQ|S*Aada z->{eVHMY>fDk;Sqca?n@z4M~`^;^o<)ZEhV?pa^KKCVnJHzq{1tO?Oa8XMIr%jp-* z1F6;;I;)tc%Vk}u7B{U__fVq6t>DWrl^T#+Hi;gEKho`%o3v^aD%k#mA|ruF&^N8~ zr;A#9L~=1y?O?NAHww{otbLI$n#h=Ql$3>OrgJ|zoTHU>BMmb{57o@9-o9ym>-^~R z%#+EH+RUnrC~HZtY>;OMh=(WUrm3;VB=yJR^EQ{!meQ@t>(GF0x!i!XrW?*2!)O=w z4%15VYUP6{uoY%P$GRK&3v3Z&nMKI<-$8F^yEgRIn|hu9SS0*#{A;@pPK81rlT-F4 zjkN8cX@!)Ag}Ri%!`wnq1IA>r<X(`Qkz@>o$LO|Uh}lRUMrn>>#(fH|1=-d-OZ7Ag z>@+eFApJJ0*=qL~7E;@0*-qgB1^)o?j=}l};(`t_LM$@A@<H{JM=yJ114{?W7nom? zBX#^Y$SLh(UrYPU#x394F7ic4+1tV2WdMmU64D)|H?^&z_{DAGcaq8~Oa(o=1^njO zWSMC1@|UT=-$J~5G(0^Q4TfiW<C~7fQVJ%Q&FQikv`(|tpf&Y-`?Yqn+p9Gj3<i_Q z<g&OdriJBgGtf<j*otLWCO+>nSOuG4b!$B~w?%8RdtF+a*X6~Z&11G$EJmwSzYrIU zMw@?P!lw<`12(Nu@C({;n{Qk@skhqALSVu^;WO|Y&s@hO=*XPXElx90MQ@u}%6aa# zcYfRJr6zHu$dhr|;^ud5*+2(Rq3hFtz!{LabFg6^NB#-$BzOv(15blzz<KZ;kh4u8 zzXUFTXTe3l>MkLD4qOKJU&$)3BE1Hl2QOrGFCzUucnMqwKL9U-AA=tO*4Zmae*#_w zuccquJ;c*n&Gj^_ET)~-Ryx_EQnIL>6BhSs>5Xn<&FAe5a`YXbgtn8G`!w{SP0d>H zfSneWG7+=P-&5uFf+y%_`^6WD9X5=OjmBo9fsk%A8VSxE>D(2X^@k(V!ST*rUkyZN zVb)`!Usbe~Tdh8`-)zy_ji!KLvmfdlBfh+1=b&%)Xw)}89r)aqrq8xK#P0Z_Z0}Nc zICRVx2}Go<r_tbv09U|CQ<!GYKwt(z%I|$-&Nm&5#&U*-_5bgjo41Xe2~x7$HWahW z7c-P<+feA5E5Qw+BHpQPKJ765?8XNo^*frB>d)^@jpc3uwm_Rg3Del3pS#x5aQx$y zzkOmE?q1rnXZQef*QU)zCO;;8F_C~xmkI9BoMcX-dLtTIH=?1R`{(5ERrWvpCDJ6j zdF7+7*WYGw`7@J4F@SfMfwOa3@>y%P9P@^h%agg?+p-PWLr;=K;S|MOi~Jnjb`8m! zQ0~k#X#5@u3?}>Wh?~VlJ%Ptt6d^i{hgy`B(vGqkPQ<faUI^HvSl@DX;8-&z<Wp4O zYH6iCo*N{HOXz%0IdzGpBG3N})pT{BT9xOS%q7nH%QRE->%{l>ZTnPqndsPIRt+=T ztguHUo1^FMA+T=;yT5YMfed@`Y)H_N+!n8^QiBOfT6a=SuLdXFv)v+l8#xs$gl$O6 z@?{zsJbUkh@Z2PxKFps%JdbCPi{KgL<;<Lob7KjeEX6LaEo+BwE6}_e<a}HBZ4{<N Sc+&2pRd+Wn$#G-<H~kM;7`iL~ delta 2081 zcmb_ddu)?c6u-CYx3$~Xt%W_x9!jO%v+erWn1hbC+qW|5U=N18mW?ron{IAnMHtMi zsEG>VXb(Y<NTwzRLsUpLY9wK1OC-J+Mna4sLLz7&Mldyi59T>tH#=hd%hQ~m$36Fa z_x`@$y`TRO_aERV{4&+usi~<47-Nf2@1ATJ;6ZsU&j6kL{^U`gPd)m^c^-#D{zBL( z|4bf_E}WB$L6sbK2woMJVWJQfyG+43xgNs87jo(e6Y=^~a!4z%V#bF*<D2=*us$Ix z(3Gv~z>zJe$D%#3I3kZ@+>LrS&`_uTQt{mAyE)A(Uz_-A)$py6XCNS2z@=EL`O3Jb zRXp>mHDOP6rtasu9|bt3=v80dF>$u1AoIHHk4vAnG+nKM%O$CyrAh^dak&+IiFGQT zjja{YM@}!BvT2yfip~0x>I9aF8QOCwoD|^juwhp)c|6i7oLn!?$3gX+DJd_)`zkLK z8C0NB*TQ!O1AMQKha>uCIIdn3@@t-rOK{+fb!-W2mdXg+P<5J}^BNdT_lo%#C&x4l zh12WeRGdIr5S#X8HgQ@NgtI0^dVxtXqY%!X6sfZ&CYfcyAO)2qktrjVGfox)Wk#WG zYmd1-<hrj=2A3QqaCG4oVRLkuRZy?fa~bsOilDhd0Sgt`p)s9b7S#B`rSE}j>U?-x zH4oOS8{w9Ic`&z1;EB|iR_M#EBfJDFCR*T5?&o3xdOB3v6~QkOIWUe0EHh|B+I*u- zEWns}Ia4MOZhfJ_!eJhP5F-dEd*KOVqr7$+Pp7$!ZDl>o%sScaw7y5psuBJ>{Bkho zXsVWWO08lA&XyWvLodOJ<+eE7KUm8*aEi1+^8`%DEf6*%F=!^?MKdFG@fAn5B-UV( zctira`!b_Ftnh<18~T>3psmy%%@x7egZca_xRs}QC%6^PpiL6xIM0CkPh;CORvR(d z4|i-{QIDP~rbKuQgWWJ_UjgHJ)=m2{+J_nu+Icf;V^1Omt<1-I@qZeRR<<qT`4E|Q z*45gW{Ogrd-tli!I)e4r#%35Ci_DqAy&tsnUZBGRwKZCBxi-%0WVYuMuBLqw=X>*; z;+rGC-CRw>so1f!<(*cis!`LuxJP(>yW?UCl-Cr&+R}=c-78_9RIv0smzG%Yx65tw zRF{=hTTPW^C3ch5Dp^eKYOC91vA8W&<ra^}Q)Pc@$g#3(pxx8e-7&Ci2-X?~V7`<u z8`>Z9!ir#0t%Tc)^ZDM{EPu!jaUT7gj2ZS<3zSVp(nna2n02}K%}#3btaA<}GU<O< zA$(Mwk=h=8D~uJ7?LeOnWT3%i3ZM<566p^_?ZK!$6t%CQJwkq<!7jW-&dG+2Tqeab zb%te&=#<Y2T^`x6&0)WXdxSnhP@bctJAm#I>7EK3ta7BM&o)AbI8WT0^Vq(0x+iCZ zt{xJJz|Vm(M-!d<=?7@>tmJ}UR6|pRn(hoF{_c_*%YW0elRa(zdcpC$3#Tq#@9(Z$ z{oV^mGA(kjm~Q~LYXu~^)CR-e>@{Zhhat_!BR5*NhK|ybV%bZ67mOKKo61`XmUTHZ zb}csd|5V>RHA&06x3UAzhK-doQ&8;+R!U+X)(Fu$I`0BtFbsp0!+bm3sq~7u7;9q- z4r6c_ze`@2SmA(k>IIOY$OD%&22M*_<P1zxa!L9Xteg?THiB;~b7y#3LEn~XaiXF7 xUHVtvM_!vTTFTgs(-QhbaA^*=iIbYn*)qm<qHn-8FAdiCVUzcfSsfLd{s#8vuyz0d -- GitLab From 25a49b93439ed7e21b447cdd1a3a13d9510fd5f3 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 29 Nov 2019 13:17:24 +0100 Subject: [PATCH 10/20] Changed some arm-functions to return a non zero int on failure --- arm/arm/arm.c | 29 +++++++++++++++++++++-------- arm/arm/arm.h | 8 ++++---- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 2e1e4841..f39a565c 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -117,11 +117,16 @@ uint8_t get_addr(char name[]){ return 254;//Name not found } -void set_led(uint8_t id, uint16_t led_value, uint8_t imode){ +/** + * Returns non-zero value on failure + * Returns 0 else + */ +uint8_t set_led(uint8_t id, uint16_t led_value, uint8_t imode){ if(led_value != 0 && led_value != 1){ - return; + return 1; } write_two_bytes(id, "LED", led_value, 1, imode); + return 0; } /** @@ -201,10 +206,11 @@ void lower_arm(){ /** * Move arm slightly forward. Meant to be used after lower_arm() has been called! * Do not call the function if the arm has not been lowered!! + * Returns a non-zero value on failure */ -void arm_forward(){ +uint8_t arm_forward(){ if(arm_forward_callable != 1){ - return; + return 1; } if( (servo_6_pos-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached @@ -225,15 +231,18 @@ void arm_forward(){ move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); _delay_ms(100); send_action(); + return 0; } /** * Move arm slightly backward. Meant to be used after lower_arm() has been called! * Do not call the function if the arm has not been lowered!! + * + * Returns a non-zero value on failure */ -void arm_backward(){ +uint8_t arm_backward(){ if(arm_forward_callable != 1){ - return; + return 1; } if( (servo_6_pos+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached @@ -254,6 +263,7 @@ void arm_backward(){ move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); _delay_ms(100); send_action(); + return 0; } @@ -263,10 +273,12 @@ void arm_backward(){ * If the servo is paired, the instruction is also sent to its paired servo with its corresponding goal position, * and their instructions are executed simultaneously. * If servo is paired, the imode is always IMODE_REG_WRITE, and must be followed by a send_action() in order to execute. + * + * Returns a non-zero value on failure */ -void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ +uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ if(id == ALL_SERVOS){//Please don't. - return; + return 1; } uint8_t lower_byte_pos = goal_position& 0xFF; @@ -303,6 +315,7 @@ void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t i } else { send_instruction(id, imode, params, 5); } + return 0; } void arm_rotate_90_left(uint16_t speed,uint8_t imode){ diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 2e35c599..7bdcf70e 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -42,7 +42,7 @@ uint8_t get_addr(char name[]); void servo_init(); /* Set led of specified servo. */ -void set_led(uint8_t id, uint16_t led_value, uint8_t imode); +uint8_t set_led(uint8_t id, uint16_t led_value, uint8_t imode); /* Set goal position of specified servo. */ void set_goal_position(uint8_t id, uint16_t goal_position, uint8_t imode); @@ -51,7 +51,7 @@ void set_goal_position(uint8_t id, uint16_t goal_position, uint8_t imode); void set_moving_speed(uint8_t id, uint16_t speed, uint8_t imode); /* Performs both goal position and set moving speed of specified servo. */ -void move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode); +uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode); /* Ping specified servo. */ void ping(uint8_t id); @@ -80,7 +80,7 @@ void lower_arm(); void arm_rotate_90_right(uint16_t speed,uint8_t imode); void arm_rotate_90_left(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); -void arm_forward(); -void arm_backward(); +uint8_t arm_forward(); +uint8_t arm_backward(); #endif // ARM_H_ \ No newline at end of file -- GitLab From 77e4c72961b3d08b7e4189e508107f4e20131bcf Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 29 Nov 2019 13:40:33 +0100 Subject: [PATCH 11/20] merged with styr2 --- arm/arm/main.c | 1 + arm/arm/steering.c | 49 ++++++++++++++++++++++++++++++++------------- arm/arm/steering.h | 10 +++++---- arm/arm/styr_komm.c | 20 +++++++++--------- 4 files changed, 53 insertions(+), 27 deletions(-) diff --git a/arm/arm/main.c b/arm/arm/main.c index 56d7d201..6c252a2e 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -68,6 +68,7 @@ int main(void){ b2 = getchar(); b3 = getchar(); translate_instruction(b1,b2,b3); + putchar(255); } diff --git a/arm/arm/steering.c b/arm/arm/steering.c index 34f5e973..e03e6b74 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -54,38 +54,59 @@ void pwm_init(){ Equation used is: u[n] = KP*e[n] + KD*(e[n] –e[n-1]) */ -void update_ctrl_signal(int16_t new_error){//TODO think of better name for ctrl_signal(styrsignal) +int16_t update_ctrl_signal(int16_t new_error){//TODO think of better name for ctrl_signal(styrsignal) int16_t ctrl_signal = KP*new_error + KD*(new_error - prev_error); prev_error = new_error; - turn(ctrl_signal); + return ctrl_signal; } -void turn(int16_t ctrl_signal) { - // TODO make wheels back if value goes below 0 +void follow_line(int16_t ctrl_signal) { int16_t new_left_speed = (int16_t) (default_speed) - (ctrl_signal/8); int16_t new_right_speed = (int16_t) (default_speed) + (ctrl_signal/8); + + // LEFT if (new_left_speed < 0) { - set_left_speed(0); - } else if (new_left_speed > 255) { - set_left_speed(255); + set_left_direction(BACK); + } else { + set_left_direction(FORWARD); + } + uint8_t abs_left_dir = 0; + if (abs(new_left_speed) > 255) { + abs_left_dir = 255; } else { - set_left_speed((uint8_t) new_left_speed); + abs_left_dir = (uint8_t) (abs(new_left_speed)); } + set_left_speed(abs_left_dir); + + // RIGHT if (new_right_speed < 0) { - set_right_speed(0); - } else if (new_right_speed > 255) { - set_right_speed(255); + set_right_direction(BACK); + } else { + set_right_direction(FORWARD); + } + uint8_t abs_right_dir = 0; + if (abs(new_right_speed) > 255) { + abs_right_dir = 255; } else { - set_right_speed((uint8_t) new_right_speed); + abs_right_dir = (uint8_t) (abs(new_right_speed)); } + set_right_speed(abs_right_dir); + putchar(default_speed); putchar(left_speed); putchar(right_speed); - //set_left_speed(left_speed+(ctrl_signal/2)); - //set_right_speed(right_speed-(ctrl_signal/2)); } +void center_line(int16_t ctrl_signal) { + if (ctrl_signal < 0) { + rotate_right(); + } else { + rotate_left(); + } +} + + void set_default_speed(uint8_t duty_threshold) { default_speed = duty_threshold; } diff --git a/arm/arm/steering.h b/arm/arm/steering.h index 2f79d689..99e53bb5 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -19,13 +19,15 @@ enum Direction{BACK, FORWARD}; #define DRIVE_ONE_BLOCK_DELAY 3400 #define TEST_SPEED 80 -#define KP 2 //Constants for styrreglering -#define KD 2 +#define KP 4 //Constants for styrreglering +#define KD 3 void pwm_init(); -void update_ctrl_signal(int16_t new_error); -void turn(int16_t ctrl_signal); +int16_t update_ctrl_signal(int16_t new_error); +void follow_line(int16_t ctrl_signal); +void center_line(int16_t ctrl_signal); + void set_right_speed(uint8_t duty_threshold); void set_left_speed(uint8_t duty_threshold); diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 6ca197b1..8f8fc063 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -104,18 +104,20 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ small_forward(); break; case 100: - // Drive to next node - break; + // Rotate to center line + set_speed(120); + center_line(update_ctrl_signal((((uint16_t)(arg1)) << 8) + arg2)); + break; case 101: - // Read line data - update_ctrl_signal((((uint16_t)(arg1)) << 8) + arg2); - break; + // Read line data + follow_line(update_ctrl_signal((((uint16_t)(arg1)) << 8) + arg2)); + break; case 102: - // Set default speed - set_default_speed(arg1); - break; - + // Set default speed + set_default_speed(arg1); + break; default: break; } + } \ No newline at end of file -- GitLab From b1aca5b040f790358921d63205c0b4b1b1739ed8 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Fri, 29 Nov 2019 15:21:29 +0100 Subject: [PATCH 12/20] Added restriction to the arm rotate --- arm/arm/arm.c | 66 ++++++++++++++++++++++++++++++++++++--------- arm/arm/arm.h | 6 +++-- arm/arm/styr_komm.c | 7 ++++- 3 files changed, 63 insertions(+), 16 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index f39a565c..487209ae 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -18,7 +18,7 @@ uint16_t servo_6_pos; uint16_t servo_4_pos; uint16_t servo_3_pos; -uint8_t arm_forward_callable = 0; //1 if instruction arm_forward should be callable 0 if not +uint8_t arm_lowered = 0; //1 if instruction arm_forward should be callable 0 if not //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { @@ -157,20 +157,53 @@ void torque_enable(uint8_t id, uint16_t enable, uint8_t imode){ write_two_bytes(id,"Torque Enable", enable, 1, imode); } -void raise_arm(){ +/** + * Disables the torque on all servos except 1 and 8; + */ +void disable_torque(){ + torque_enable(2,0,IMODE_WRITE);//Disable servos 2 and 3 since they don't need to work + torque_enable(3,0,IMODE_WRITE); + torque_enable(4,0,IMODE_WRITE); + torque_enable(5,0,IMODE_WRITE); + torque_enable(6,0,IMODE_WRITE); + torque_enable(7,0,IMODE_WRITE); +} + +uint8_t raise_arm(){ + if(arm_lowered != 1){ + return 1; //Arm is not lowered. Do not raise + } move_to_angle(2,0x00AF,0x031F,IMODE_REG_WRITE); move_to_angle(5,0x00AF,0x0300,IMODE_REG_WRITE); move_to_angle(6,0x00AF,0x03FF,IMODE_REG_WRITE); - _delay_ms(2000); + _delay_ms(200); send_action(); _delay_ms(2000); - torque_enable(2,0,IMODE_WRITE);//Disable servos 2 and 3 since they don't need to work - torque_enable(3,0,IMODE_WRITE); - arm_forward_callable = 0; - + arm_lowered = 0; + return 0; } +/** + * Lowers the robot arm to a position where it should be able to pick up stuff + * Takes a direction for which side the body should rotate to first, 1 for right, 0 for left + * Note that this means the arm will be lowered to the left side if dir=1 and right side if dir=0 + * + * Returns a non-zero value on failure + */ +uint8_t lower_arm(uint8_t dir){ + if(arm_lowered == 1){ + return 1;//Arm already lowered + } + + if(dir == 1){ + arm_rotate_90_right(0x00FF, IMODE_WRITE); + } + else if(dir == 0){ + arm_rotate_90_left(0x00FF,IMODE_WRITE); + } + else{ + return 1;//Bad dir + } -void lower_arm(){ torque_enable(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called torque_enable(3,1,IMODE_WRITE);//we make sure that they are enabled here _delay_ms(200); @@ -200,7 +233,8 @@ void lower_arm(){ servo_4_pos = 400; servo_6_pos = 818; - arm_forward_callable = 1; + arm_lowered = 1; + return 0; } /** @@ -209,7 +243,7 @@ void lower_arm(){ * Returns a non-zero value on failure */ uint8_t arm_forward(){ - if(arm_forward_callable != 1){ + if(arm_lowered != 1){ return 1; } @@ -241,7 +275,7 @@ uint8_t arm_forward(){ * Returns a non-zero value on failure */ uint8_t arm_backward(){ - if(arm_forward_callable != 1){ + if(arm_lowered != 1){ return 1; } @@ -273,13 +307,15 @@ uint8_t arm_backward(){ * If the servo is paired, the instruction is also sent to its paired servo with its corresponding goal position, * and their instructions are executed simultaneously. * If servo is paired, the imode is always IMODE_REG_WRITE, and must be followed by a send_action() in order to execute. + * The arm can't rotate if it is down. * * Returns a non-zero value on failure */ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ - if(id == ALL_SERVOS){//Please don't. + if(id == ALL_SERVOS || (id == 1 && arm_lowered)){ // Please don't. + // Don't rotate the arm when arm is down return 1; - } + } uint8_t lower_byte_pos = goal_position& 0xFF; uint8_t higher_byte_pos = goal_position >> 8; @@ -326,6 +362,10 @@ void arm_rotate_90_right(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x0332,imode); } +void arm_rotate_default(uint16_t speed,uint8_t imode){ + move_to_angle(1, speed, 0x01FF,imode); +} + /** * Set counter clockwise limit for servo position */ diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 7bdcf70e..5084a7fb 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -75,12 +75,14 @@ void send_instruction(uint8_t id, uint8_t imode, uint8_t *params, uint8_t param_ void set_return_delay(uint8_t id, uint16_t delay, uint8_t imode); void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode); void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode); -void raise_arm(); -void lower_arm(); +uint8_t raise_arm(); +uint8_t lower_arm(uint8_t dir); void arm_rotate_90_right(uint16_t speed,uint8_t imode); void arm_rotate_90_left(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); uint8_t arm_forward(); uint8_t arm_backward(); +void disable_torque(); +void arm_rotate_default(uint16_t speed,uint8_t imode); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 8f8fc063..ff9d17d9 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -83,7 +83,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ arm_rotate_90_right(arg1,IMODE_WRITE); break; case 19: //arm down - lower_arm(); + lower_arm(arg1); break; case 20://arm up raise_arm(); @@ -103,6 +103,11 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 52: //Small forward small_forward(); break; + case 53: + disable_torque(); + break; + case 54: + arm_rotate_default(arg1,IMODE_WRITE); case 100: // Rotate to center line set_speed(120); -- GitLab From 474404e6149e23f70230496febcaeed1d6611d8c Mon Sep 17 00:00:00 2001 From: jonjo049 <jonjo049@student.liu.se> Date: Sat, 30 Nov 2019 15:52:07 +0100 Subject: [PATCH 13/20] Minor changes --- arm/arm/arm.c | 40 +++++++++----- arm/arm/steering.c | 22 ++++---- arm/arm/styr_komm.c | 23 +++++--- arm/arm/styrmodul.cproj | 120 ++++++++++++++++++++++++---------------- 4 files changed, 121 insertions(+), 84 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 487209ae..7f606336 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -152,21 +152,27 @@ void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode){ write_two_bytes(id, "Baud Rate", baud_rate, 1, imode); } -//Enable or disable torque for a servo with the given id -void torque_enable(uint8_t id, uint16_t enable, uint8_t imode){ +void set_torque(uint8_t id, uint16_t enable, uint8_t imode){ write_two_bytes(id,"Torque Enable", enable, 1, imode); } /** - * Disables the torque on all servos except 1 and 8; + * Disables the torque on all servos except servos with id's 1 and 8. + * This is used after grabbing the item to not exhaust the servos, but since 8 is holding the item and 1 is used for keeping the arm steady these remain powered. */ -void disable_torque(){ - torque_enable(2,0,IMODE_WRITE);//Disable servos 2 and 3 since they don't need to work - torque_enable(3,0,IMODE_WRITE); - torque_enable(4,0,IMODE_WRITE); - torque_enable(5,0,IMODE_WRITE); - torque_enable(6,0,IMODE_WRITE); - torque_enable(7,0,IMODE_WRITE); +void disable_all_torque(){ + for (int i = 2; i < 8; i++) { + set_torque(i, 0, IMODE_WRITE); + } +} + +/** + * Enables the torque on all servos. + */ +void enable_all_torque() { + for (int i = 1; i <= 8; i++) { + set_torque(i, 1, IMODE_WRITE); + } } uint8_t raise_arm(){ @@ -204,8 +210,8 @@ uint8_t lower_arm(uint8_t dir){ return 1;//Bad dir } - torque_enable(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called - torque_enable(3,1,IMODE_WRITE);//we make sure that they are enabled here + set_torque(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called + set_torque(3,1,IMODE_WRITE);//we make sure that they are enabled here _delay_ms(200); move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); @@ -244,7 +250,7 @@ uint8_t lower_arm(uint8_t dir){ */ uint8_t arm_forward(){ if(arm_lowered != 1){ - return 1; + return 1; //Don't call if not lowered } if( (servo_6_pos-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached @@ -303,11 +309,11 @@ uint8_t arm_backward(){ /** * Moves the servo with the given id to a given goal position with the given speed - * Sends an instruction that sets the speed and the goal position with only one package + * These functions can be merged into one function and can be sent using only one package due to the memory configuration in the servo. * If the servo is paired, the instruction is also sent to its paired servo with its corresponding goal position, * and their instructions are executed simultaneously. * If servo is paired, the imode is always IMODE_REG_WRITE, and must be followed by a send_action() in order to execute. - * The arm can't rotate if it is down. + * This function can't be called if the arm is down due to safety reasons. * * Returns a non-zero value on failure */ @@ -362,6 +368,10 @@ void arm_rotate_90_right(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x0332,imode); } +/** + * Returns the arm to its "resting position". + * Used after item has been grabbed and the car is about to drive. + */ void arm_rotate_default(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x01FF,imode); } diff --git a/arm/arm/steering.c b/arm/arm/steering.c index e03e6b74..959f1ade 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -6,6 +6,8 @@ */ #define F_CPU 16000000UL + +//Help-functions for accessing and modifying bytes #define bit_set(port, bit) (port) |= (1<<(bit)) #define bit_clear(port, bit) (port) &= ~(1<<(bit)) #define bit_get(port, bit) (port) & (1<<(bit)) @@ -20,17 +22,15 @@ uint8_t right_speed = 0;//Current speed of the right wheel pair uint8_t left_speed = 0; uint8_t default_speed = DEFAULT_SPEED; - - enum Direction left_dir;//Current Direction of the left wheel pair enum Direction right_dir; enum Direction DEFAULT_DIR = FORWARD; -/* -Fault for "styrreglering" -The range of the error values are: -32768 to 32767 --32768 < left < 0 < right < 32767 -*/ +/** + * Fault for "styrreglering" + * The range of the error values are: -32768 to 32767 + * -32768 < left < 0 < right < 32767 + **/ int16_t prev_error; /** @@ -50,10 +50,10 @@ void pwm_init(){ prev_error = 0; } -/* - Equation used is: - u[n] = KP*e[n] + KD*(e[n] –e[n-1]) -*/ +/** + * Equation used is: + * u[n] = KP*e[n] + KD*(e[n] –e[n-1]) + */ int16_t update_ctrl_signal(int16_t new_error){//TODO think of better name for ctrl_signal(styrsignal) int16_t ctrl_signal = KP*new_error + KD*(new_error - prev_error); prev_error = new_error; diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index ff9d17d9..0d694c9c 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -9,6 +9,9 @@ #include "steering.h" #include "arm.h" +//This is the return value returned when the pi initially asks to identify this unit. +#define STYRMODUL_ID 10 + /** * Executes an instruction according to the given instruction number and the given arguments * @@ -20,7 +23,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ switch (instr) { case 255: //Identify - putchar(10); + putchar(STYRMODUL_ID); break; case 0: //Forward set_direction(FORWARD); @@ -30,21 +33,21 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ set_direction(BACK); set_speed(arg1); break; - case 2://Turn left (Noting?) + case 2://Turn left + set_direction(FORWARD); set_right_speed(arg1); set_left_speed(arg1*TURN_CONSTANT); break; - case 3: //Turn right (Noting?) + case 3: //Turn right + set_direction(FORWARD); set_right_speed(arg1*TURN_CONSTANT); set_left_speed(arg1); break; case 4: //Rotate left - //Setup directions for rotation. Needs a speed to initiate. set_speed(arg1); rotate_left(); break; case 5: //Rotate right - //Setup directions for rotation. Needs a speed to initiate. set_speed(arg1); rotate_right(); break; @@ -54,18 +57,21 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 7://Set driving speed set_speed(arg1); break; - case 8: //set angle + case 8: //move to angle move_to_angle(arg1, 0x00FF, arg2, IMODE_REG_WRITE);//arg1 is id arg2 is goal_position send_action();//Always send_action since we might call a pair of servos break; case 9: //stop servo - torque_enable(arg1,0,IMODE_WRITE); + set_torque(arg1,0,IMODE_WRITE); break; case 10: //get angle + //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented break; case 11: //get temperature + //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented break; case 12: //get voltage + //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented break; case 13: //set servo speed set_moving_speed(arg1, arg2, IMODE_WRITE); @@ -104,7 +110,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ small_forward(); break; case 53: - disable_torque(); + disable_all_torque(); break; case 54: arm_rotate_default(arg1,IMODE_WRITE); @@ -124,5 +130,4 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ default: break; } - } \ No newline at end of file diff --git a/arm/arm/styrmodul.cproj b/arm/arm/styrmodul.cproj index 22033b1b..f3856712 100644 --- a/arm/arm/styrmodul.cproj +++ b/arm/arm/styrmodul.cproj @@ -2,7 +2,7 @@ <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <SchemaVersion>2.0</SchemaVersion> - <ProjectVersion>6.2</ProjectVersion> + <ProjectVersion>7.0</ProjectVersion> <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName> <ProjectGuid>{dafab8c5-acd9-4d74-b97a-bdb50cb799dc}</ProjectGuid> <avrdevice>ATmega1284P</avrdevice> @@ -55,59 +55,81 @@ <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <ToolchainSettings> <AvrGcc> - <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> - <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> - <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> - <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> - <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> - <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> - <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> - <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> - <avrgcc.compiler.symbols.DefSymbols> - <ListValues> - <Value>NDEBUG</Value> - </ListValues> - </avrgcc.compiler.symbols.DefSymbols> - <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> - <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> - <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> - <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> - <avrgcc.linker.libraries.Libraries> - <ListValues> - <Value>libm</Value> - </ListValues> - </avrgcc.linker.libraries.Libraries> - </AvrGcc> + <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>NDEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.directories.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.compiler.directories.IncludePaths> + <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + <avrgcc.assembler.general.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.assembler.general.IncludePaths> +</AvrGcc> </ToolchainSettings> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ToolchainSettings> <AvrGcc> - <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> - <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> - <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> - <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> - <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> - <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> - <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> - <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> - <avrgcc.compiler.symbols.DefSymbols> - <ListValues> - <Value>DEBUG</Value> - </ListValues> - </avrgcc.compiler.symbols.DefSymbols> - <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level> - <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> - <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> - <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> - <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> - <avrgcc.linker.libraries.Libraries> - <ListValues> - <Value>libm</Value> - </ListValues> - </avrgcc.linker.libraries.Libraries> - <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> - </AvrGcc> + <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>DEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.directories.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.compiler.directories.IncludePaths> + <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + <avrgcc.assembler.general.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.assembler.general.IncludePaths> + <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> +</AvrGcc> </ToolchainSettings> </PropertyGroup> <ItemGroup> -- GitLab From ebfd7e3b4412f334c05a854d69eddb3cbb850583 Mon Sep 17 00:00:00 2001 From: Jonatan Jonsson <jonjo049@student.liu.se> Date: Mon, 2 Dec 2019 15:02:32 +0100 Subject: [PATCH 14/20] added increment and decrement --- arm/arm/arm.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ arm/arm/arm.h | 6 +++- arm/arm/main.c | 38 ++++++++++++++++++++++--- arm/arm/styr_komm.c | 14 +++++++-- 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 7f606336..a40e0d88 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -18,6 +18,54 @@ uint16_t servo_6_pos; uint16_t servo_4_pos; uint16_t servo_3_pos; +uint16_t servo_angle[8]; + +/* + + set_cw_limit(1,0x0000,IMODE_WRITE); + set_ccw_limit(1,0x03FF,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(2,0x0000,IMODE_WRITE);//TODO check limits + set_ccw_limit(2,0x03FF,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(3,0x0000,IMODE_WRITE);//TODO check limits + set_ccw_limit(3,0x03FF,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(4,0x0000,IMODE_WRITE);//TODO check limits + set_ccw_limit(4,0x03FF,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(5,0x0000,IMODE_WRITE);//TODO check limits + set_ccw_limit(5,0x0330,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(6,0x00FF,IMODE_WRITE); + set_ccw_limit(6,0x0330,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(7,0x0000,IMODE_WRITE); + set_ccw_limit(7,0x03FF,IMODE_WRITE); + _delay_ms(100); + set_cw_limit(8,0x0000,IMODE_WRITE); + set_ccw_limit(8,0x03FF,IMODE_WRITE); + +*/ + + +uint16_t servo_cw_limits[8] = {0, + 0, + 0, + 0, + 0, + 0x00FF, + 0, + 0}; +uint16_t servo_ccw_limits[8] = {0x03FF, + 0x03FF, + 0x03FF, + 0x03FF, + 0x0330, + 0x0330, + 0x03FF, + 0x03FF}; + uint8_t arm_lowered = 0; //1 if instruction arm_forward should be callable 0 if not //Array of instruction names. The index of the instruction string is the address of the instruction. @@ -202,9 +250,11 @@ uint8_t lower_arm(uint8_t dir){ if(dir == 1){ arm_rotate_90_right(0x00FF, IMODE_WRITE); + servo_angle[0] = 0x0332; } else if(dir == 0){ arm_rotate_90_left(0x00FF,IMODE_WRITE); + servo_angle[0] = 0x00D5; } else{ return 1;//Bad dir @@ -233,12 +283,22 @@ uint8_t lower_arm(uint8_t dir){ move_to_angle(6, 0x00FF, 818,IMODE_REG_WRITE); move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE);//Open claw + move_to_angle(7, 0x00FF, 0x01FF, IMODE_REG_WRITE);//Just for default value, this is never changed send_action(); servo_3_pos = 700; servo_4_pos = 400; servo_6_pos = 818; + //Setup angles for manual arm steering + servo_angle[1] = 0x03FF - 700; + servo_angle[2] = 700; + servo_angle[3] = 400; + servo_angle[4] = 0x03FF - 400; + servo_angle[5] = 818; + servo_angle[6] = 0x01FF; + servo_angle[7] = 0x01FF; + arm_lowered = 1; return 0; } @@ -368,6 +428,15 @@ void arm_rotate_90_right(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x0332,imode); } +uint8_t increment_servo(uint8_t id, int8_t delta_angle) { + uint8_t servo_angle_temp = servo_angle[id-1] + delta_angle; + if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { + return 1; + } + move_to_angle(id, 0x00FF, servo_angle_temp, IMODE_WRITE); + return 0; +} + /** * Returns the arm to its "resting position". * Used after item has been grabbed and the car is about to drive. diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 5084a7fb..1b035a58 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -30,6 +30,8 @@ #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo +#define INCREMENT_CONSTANT 10 //Check this + //TODO test these positions #define SERVO_90_RIGHT 205 //Position for 90 degrees to the right #define SERVO_90_LEFT 818 //Position for 90 degrees to the left @@ -82,7 +84,9 @@ void arm_rotate_90_left(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); uint8_t arm_forward(); uint8_t arm_backward(); -void disable_torque(); void arm_rotate_default(uint16_t speed,uint8_t imode); +void enable_all_torque(); +uint8_t increment_servo(uint8_t id, int8_t delta_angle); +void disable_all_torque(); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 6c252a2e..9fe459d7 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -46,13 +46,43 @@ int main(void){ if (!cold()) { return 2; } - - // init - servo_init(); /************************************************************************/ /* TEST BELOW */ /************************************************************************/ + /**lower_arm(0); + _delay_ms(10000); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + increment_servo(8, 20); + _delay_ms(2000); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + increment_servo(8, -20); + _delay_ms(2000); + raise_arm(); + arm_rotate_default(0x00FF, IMODE_WRITE); + _delay_ms(3000); + disable_all_torque(); + */ /************************************************************************/ /* TEST ABOVE */ @@ -62,7 +92,6 @@ int main(void){ uint8_t b1, b2, b3,b4,b5,b6,b7,b8; - while (true) { b1 = getchar(); b2 = getchar(); @@ -83,6 +112,7 @@ bool cold(){ uart_init(); uart_arm_init(); pwm_init(); + servo_init(); stdout = &uart_output; stdin = &uart_input; diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 0d694c9c..3f4f91ea 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -109,11 +109,21 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 52: //Small forward small_forward(); break; - case 53: + case 53: //Disable all torque disable_all_torque(); break; - case 54: + case 55: //Enable all torque + enable_all_torque(); + break; + case 54: //Rotate default arm_rotate_default(arg1,IMODE_WRITE); + break; + case 56: //Increment servo + increment_servo(arg1, INCREMENT_CONSTANT); + break; + case 57: //Decrement servo + increment_servo(arg1, -INCREMENT_CONSTANT); + break; case 100: // Rotate to center line set_speed(120); -- GitLab From b793f02ac0f76f126defa45ef26f011ce380969a Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Tue, 3 Dec 2019 17:02:59 +0100 Subject: [PATCH 15/20] Fixed some bugs in the arm --- arm/arm/arm.c | 92 ++++++++++++------------ arm/arm/arm.h | 5 +- arm/arm/main.c | 11 +++ arm/arm/styr_komm.c | 2 +- arm/arm/styrmodul6_2.cproj | 143 +++++++++++++++++++++++++++++++++++++ arm/styrmodul.atsuo | Bin 19456 -> 19456 bytes 6 files changed, 202 insertions(+), 51 deletions(-) create mode 100644 arm/arm/styrmodul6_2.cproj diff --git a/arm/arm/arm.c b/arm/arm/arm.c index a40e0d88..6072ffeb 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -14,10 +14,6 @@ #include "arm.h" #include "serial.h" -uint16_t servo_6_pos; -uint16_t servo_4_pos; -uint16_t servo_3_pos; - uint16_t servo_angle[8]; /* @@ -57,13 +53,13 @@ uint16_t servo_cw_limits[8] = {0, 0x00FF, 0, 0}; -uint16_t servo_ccw_limits[8] = {0x03FF, - 0x03FF, - 0x03FF, - 0x03FF, - 0x0330, - 0x0330, - 0x03FF, +uint16_t servo_ccw_limits[8] = {0x03FF,//1 + 0x03FF,//2 + 0x03FF,//3 + 0x03FF,//4 + 0x03FF,//5 + 0x0330,//6 + 0x03FF,//7 0x03FF}; uint8_t arm_lowered = 0; //1 if instruction arm_forward should be callable 0 if not @@ -271,10 +267,6 @@ uint8_t lower_arm(uint8_t dir){ send_action(); _delay_ms(2000); - move_to_angle(3, 0x00FF, 550, IMODE_REG_WRITE); - send_action(); - _delay_ms(2000); - move_to_angle(4, 0x00FF, 400, IMODE_REG_WRITE); move_to_angle(3, 0x00A0, 700, IMODE_REG_WRITE); move_to_angle(8,0x00FF,0x01FF,IMODE_REG_WRITE); @@ -286,19 +278,6 @@ uint8_t lower_arm(uint8_t dir){ move_to_angle(7, 0x00FF, 0x01FF, IMODE_REG_WRITE);//Just for default value, this is never changed send_action(); - servo_3_pos = 700; - servo_4_pos = 400; - servo_6_pos = 818; - - //Setup angles for manual arm steering - servo_angle[1] = 0x03FF - 700; - servo_angle[2] = 700; - servo_angle[3] = 400; - servo_angle[4] = 0x03FF - 400; - servo_angle[5] = 818; - servo_angle[6] = 0x01FF; - servo_angle[7] = 0x01FF; - arm_lowered = 1; return 0; } @@ -313,22 +292,22 @@ uint8_t arm_forward(){ return 1; //Don't call if not lowered } - if( (servo_6_pos-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached - servo_6_pos = SERVO_6_LOWER_LIMIT; + if( (servo_angle[5]-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached + servo_angle[5] = SERVO_6_LOWER_LIMIT; } else{ - servo_6_pos = servo_6_pos - ARM_FORWARD_DELTA; + servo_angle[5] = servo_angle[5] - ARM_FORWARD_DELTA; } - if( (servo_4_pos+ARM_FORWARD_DELTA) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached - servo_4_pos = SERVO_4_UPPER_LIMIT; + if( (servo_angle[3] + ARM_FORWARD_DELTA) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached + servo_angle[3] = SERVO_4_UPPER_LIMIT; } else{ - servo_4_pos = servo_4_pos + ARM_FORWARD_DELTA; + servo_angle[3] = servo_angle[3]+ ARM_FORWARD_DELTA; } - move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); - move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + move_to_angle(6, 0x00FF, servo_angle[5], IMODE_REG_WRITE); + move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); _delay_ms(100); send_action(); return 0; @@ -345,22 +324,22 @@ uint8_t arm_backward(){ return 1; } - if( (servo_6_pos+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached - servo_6_pos = SERVO_6_UPPER_LIMIT; + if( (servo_angle[5]+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached + servo_angle[5] = SERVO_6_UPPER_LIMIT; } else{ - servo_6_pos = servo_6_pos + ARM_FORWARD_DELTA; + servo_angle[5] = servo_angle[5] + ARM_FORWARD_DELTA; } - if( servo_4_pos-ARM_FORWARD_DELTA <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached - servo_4_pos = SERVO_4_LOWER_LIMIT; + if( servo_angle[3]-ARM_FORWARD_DELTA <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached + servo_angle[3] = SERVO_4_LOWER_LIMIT; } else{ - servo_4_pos = servo_4_pos - ARM_FORWARD_DELTA; + servo_angle[3] = servo_angle[3] - ARM_FORWARD_DELTA; } - move_to_angle(6, 0x00FF, servo_6_pos, IMODE_REG_WRITE); - move_to_angle(4, 0x00FF, servo_4_pos, IMODE_REG_WRITE); + move_to_angle(6, 0x00FF, servo_angle[5], IMODE_REG_WRITE); + move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); _delay_ms(100); send_action(); return 0; @@ -381,7 +360,7 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ if(id == ALL_SERVOS || (id == 1 && arm_lowered)){ // Please don't. // Don't rotate the arm when arm is down return 1; - } + } uint8_t lower_byte_pos = goal_position& 0xFF; uint8_t higher_byte_pos = goal_position >> 8; @@ -392,6 +371,7 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos, higher_byte_pos, lower_byte_speed, higher_byte_speed}; if (id == 2 || id == 3 || id == 4 || id == 5){//Servo-pairs (2 and 3) and (4 and 5) should always move together with "opposite" goal_position + servo_angle[id-1] = goal_position; //Update current servo angle for given servo id send_instruction(id, IMODE_REG_WRITE, params, 5); _delay_ms(200); uint16_t goal_position_2 = MAX_GOAL_POSITION - goal_position; @@ -400,21 +380,26 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ uint8_t params[5] = {get_addr("Goal Position"), lower_byte_pos_2, higher_byte_pos_2, lower_byte_speed, higher_byte_speed}; switch (id) { case 2: - send_instruction(3, IMODE_REG_WRITE, params, 5); + servo_angle[2] = goal_position_2; //Update servo angle for other servo in pair + send_instruction(3, IMODE_REG_WRITE, params, 5);//Move other servo in pair break; case 3: + servo_angle[1] = goal_position_2; send_instruction(2, IMODE_REG_WRITE, params, 5); break; case 4: + servo_angle[4] = goal_position_2; send_instruction(5, IMODE_REG_WRITE, params, 5); break; case 5: + servo_angle[3] = goal_position_2; send_instruction(4, IMODE_REG_WRITE, params, 5); break; default: break; } } else { + servo_angle[id-1] = goal_position; send_instruction(id, imode, params, 5); } return 0; @@ -428,8 +413,19 @@ void arm_rotate_90_right(uint16_t speed,uint8_t imode){ move_to_angle(1, speed, 0x0332,imode); } -uint8_t increment_servo(uint8_t id, int8_t delta_angle) { - uint8_t servo_angle_temp = servo_angle[id-1] + delta_angle; +uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { + volatile uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; + volatile test = 1; + if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { + return 1; + } + move_to_angle(id, 0x00FF, servo_angle_temp, IMODE_WRITE); + return 0; +} + +uint8_t decrement_servo(uint8_t id, uint16_t delta_angle) { + volatile uint16_t servo_angle_temp = servo_angle[id-1] - delta_angle; + volatile test = 1; if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return 1; } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 1b035a58..1dbcf880 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -26,7 +26,7 @@ #define SERVO_4_UPPER_LIMIT 0x03FF #define SERVO_4_LOWER_LIMIT 0x0000 -#define ARM_FORWARD_DELTA 20 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled +#define ARM_FORWARD_DELTA 10 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo @@ -86,7 +86,8 @@ uint8_t arm_forward(); uint8_t arm_backward(); void arm_rotate_default(uint16_t speed,uint8_t imode); void enable_all_torque(); -uint8_t increment_servo(uint8_t id, int8_t delta_angle); +uint8_t increment_servo(uint8_t id, uint16_t delta_angle); void disable_all_torque(); +uint8_t decrement_servo(uint8_t id, uint16_t delta_angle); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 9fe459d7..b73944e8 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -89,6 +89,17 @@ int main(void){ /************************************************************************/ + lower_arm(0); + _delay_ms(8000); + for (int i=0; i<5; i++) + { + increment_servo(8,50); + _delay_ms(500); + decrement_servo(8,30); + _delay_ms(500); + } + + raise_arm(); uint8_t b1, b2, b3,b4,b5,b6,b7,b8; diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 3f4f91ea..f3dd75a4 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -122,7 +122,7 @@ void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ increment_servo(arg1, INCREMENT_CONSTANT); break; case 57: //Decrement servo - increment_servo(arg1, -INCREMENT_CONSTANT); + decrement_servo(arg1, INCREMENT_CONSTANT); break; case 100: // Rotate to center line diff --git a/arm/arm/styrmodul6_2.cproj b/arm/arm/styrmodul6_2.cproj new file mode 100644 index 00000000..22033b1b --- /dev/null +++ b/arm/arm/styrmodul6_2.cproj @@ -0,0 +1,143 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <SchemaVersion>2.0</SchemaVersion> + <ProjectVersion>6.2</ProjectVersion> + <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName> + <ProjectGuid>{dafab8c5-acd9-4d74-b97a-bdb50cb799dc}</ProjectGuid> + <avrdevice>ATmega1284P</avrdevice> + <avrdeviceseries>none</avrdeviceseries> + <OutputType>Executable</OutputType> + <Language>C</Language> + <OutputFileName>$(MSBuildProjectName)</OutputFileName> + <OutputFileExtension>.elf</OutputFileExtension> + <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory> + <AssemblyName>arm</AssemblyName> + <Name>styrmodul</Name> + <RootNamespace>arm</RootNamespace> + <ToolchainFlavour>Native</ToolchainFlavour> + <KeepTimersRunning>true</KeepTimersRunning> + <OverrideVtor>false</OverrideVtor> + <CacheFlash>true</CacheFlash> + <ProgFlashFromRam>true</ProgFlashFromRam> + <RamSnippetAddress>0x20000000</RamSnippetAddress> + <UncachedRange /> + <preserveEEPROM>true</preserveEEPROM> + <OverrideVtorValue>exception_table</OverrideVtorValue> + <BootSegment>2</BootSegment> + <eraseonlaunchrule>0</eraseonlaunchrule> + <AsfFrameworkConfig> + <framework-data xmlns=""> + <options /> + <configurations /> + <files /> + <documentation help="" /> + <offline-documentation help="" /> + <dependencies> + <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.19.0" /> + </dependencies> + </framework-data> + </AsfFrameworkConfig> + <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool> + <com_atmel_avrdbg_tool_atmelice> + <ToolOptions> + <InterfaceProperties> + <JtagDbgClock>200000</JtagDbgClock> + </InterfaceProperties> + <InterfaceName>JTAG</InterfaceName> + </ToolOptions> + <ToolType>com.atmel.avrdbg.tool.atmelice</ToolType> + <ToolNumber>J41800087887</ToolNumber> + <ToolName>Atmel-ICE</ToolName> + </com_atmel_avrdbg_tool_atmelice> + <avrtoolinterface>JTAG</avrtoolinterface> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> + <ToolchainSettings> + <AvrGcc> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>NDEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + </AvrGcc> + </ToolchainSettings> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> + <ToolchainSettings> + <AvrGcc> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>DEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> + </AvrGcc> + </ToolchainSettings> + </PropertyGroup> + <ItemGroup> + <Compile Include="arm.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="arm.h"> + <SubType>compile</SubType> + </Compile> + <Compile Include="main.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="serial.h"> + <SubType>compile</SubType> + </Compile> + <Compile Include="serial.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="steering.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="steering.h"> + <SubType>compile</SubType> + </Compile> + <Compile Include="styr_komm.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="styr_komm.h"> + <SubType>compile</SubType> + </Compile> + </ItemGroup> + <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" /> +</Project> \ No newline at end of file diff --git a/arm/styrmodul.atsuo b/arm/styrmodul.atsuo index 53f225e5c900616c47292033fad217f556bf0195..98a9e2ea0e28d9564a780893d134fa3c68f3d144 100644 GIT binary patch delta 1080 zcmYk5Ur19?9LLYmySen<HI?c7)8_QfO`U({pZt%T8&Yb_*$^TLC5)m7s%wZ5?XicT zwl9PwJr+tY<$dT;!5#tw^+5=H$fAT^<ATyd^*id|{x090^ZT6dIrn#eoTV0cYJtBS zmAD07$zyi}YGOZ@cX%#iELD$r={(l`A+$&m4y6%=<q?-i|0u96sToDWoMq(5WLQ3j z{}OMd^)^yFse^Qu)Jf_hiFKh~(_G{Ol!r-~ys0vgXJhijcSVfpM5#JMlWU|UQr0BK zo5DcjGaA#0QO8y1{;S``zlN437ueLa{|nM`iypQ~IkNaP|H*Fg3DEN63eO=@Z>ENz z;^cBO)e4ff3KP(cf(?#?KqO<2Vm&_u&7Q<|EC|ECB|FJzHJRmVN+w7mkWh#5Q!T<< z#}2}3Tu&9oEV74I>?HAGQJij+#B-19C^KPb<zupoK#2+JM)?+(P7yh-pmIwV$5fdt z6)lvUCW**r!pj(^hXU!&5W?;^`0jbkdvV8|z&lSX_WIf@I$1Y8F&1SHSrZ#)Gwc>= zn%$#ak*a}=SCb#aB14hEu4qSNB#M-`5|jNl>`AWNX?7Q@UMG^?;7auxM@e-GYc(l6 zRo$X*cpWIhff~Uj$2cxDj-t!w#;(tYuc{S`)E-yBnW>E`+(9LllCqtFRvX8<6tad0 z?sNR9o#)+{^<T7kO)gp73CfQG-xMbX1JzhnB53d__z(y~ag1WP?mp(~6ioPn2nWNN z`q)wDYG_yXb-YKPt$)PN^br#haf97v8a3oP&Bd)^dSS4cW2~?RE516sXx!!fm~D#V zV?#R*n>Iwby3xFuqcD}+wWRFvFj_Yi?jurXqPo#0Thj>_Ts`exVHNS54CcScOUf4o zODBps{dg?PB72{>%vbu(S@Fpqgf=)P2Z&aZ#2H8T-XLfr5Hv$AnzR*|fNn&SR$HN& IXv0tVe|5r<7XSbN delta 1344 zcmY+@Z)_7~90%~{*>2r!yZ*UBH=Rqny0&zq9lZe#JEpx}1+kb8Y)mv${!X3BUpvGi z+o2Fm^ab=sV2X+$;2&Ta9*Mql2{F-Vq!4%oA>j>gct_5}n7H}9a!YP^`SkZZ-``#D zdiPYH;Q9ogS}X8&3JF0^<<5!V?Ae>VmN7QHm`cJL(!2^K1%dt%a&A70&FWc|t_k6? zTcEvlx#~e?-Jj_V==H)<SO&}C3Fw0r@Fb+*LzuyL4A}LMUCZ?w$6vzuWqUqk*H`Vj z5p@%6hAr?q48v>i9lQY}unpb<>l%kqx5EzD3A<o7yaPoTg+1^t>}5=0?_p4aeegc) zhcOrj9gbc6Z^`Y_n%pN7x9|Tt*7*?~k&;GQ6l$b;bR#hLc&ONzC(Waf*_d~;26Woy zb(;!e$PpN3(;uArVrto=J$%+dN0*A8g6MY!rl&$#Z&G|5;fp|*W3SMI@Om2Z-86JL zTPKM~J&schvn5|!eOtx0L8$|smU-Q_3YV;#Z*rt$wpXM_5y+0vpTy*#gb!?uYz(6Y zcATbG_fa}<uGWj2c|OqU9>!a;p78(^S(J7K^0ob}A9Wo~2YcyW;A48Tqa~AI8LW_H zSTzYeeuZUO5+jv8gRzQH61xf-)=!eHs_q(&-p_j2*6MpBIorMP49}*L*!N}CRcdC1 zwmhL~q<0i)$S(>?R!NjY?Y_IknbX=&6?w9aef_(4_6nB$LeeE44Tc07h%M&Z3_Uc> zX}VJ<Mb6XCh>PwhE?OIIrh*)|=k=8H$#f~K(&0#ej&{X~%PA@)f;1V4l%pD5X&oRv zinr*)uYUyQmV`^e<VFqs8!hpE8eQ}P{U*d^Yn>vmZo|7rHoZ*;x)#v=h@Yl>Uh>9b z^ov`ilemXNv2=Buk(){G+C%Fb(&g@~B;eF;n7a&LX^eJ{^QNbeZLNMSqazJFXnXuR z{Ty3OW07Y1EOCoJO`|<|=`kEp<2*Y}fA{?La0%8qa>HD5wZ_fEh!#0wGJCJOSrkdk zks9Vw$>l$Q<O3i$2-Yv1A%CiG<S1sx;h3FHpnd_L!wEb467?%M38(DrH0n2S2F}7c z_!fSE@4>pldDIJV5hjgOsT}`t<+Coa3)8tLM8(XY_3t4wGbnYU5uex83Zlyq7^YTm MiLK70_}r)be@rK*xBvhE -- GitLab From 78e144170faeb6b29fc224a0401cdb65b9da1742 Mon Sep 17 00:00:00 2001 From: Jonatan Jonsson <jonjo049@student.liu.se> Date: Wed, 4 Dec 2019 10:53:59 +0100 Subject: [PATCH 16/20] small testing of limits, changed some --- arm/arm/arm.c | 38 ++++--------------------- arm/arm/main.c | 57 ++++++++++---------------------------- arm/arm/styrmodul6_2.cproj | 1 + 3 files changed, 21 insertions(+), 75 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 6072ffeb..a5b31321 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -16,40 +16,12 @@ uint16_t servo_angle[8]; -/* - - set_cw_limit(1,0x0000,IMODE_WRITE); - set_ccw_limit(1,0x03FF,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(2,0x0000,IMODE_WRITE);//TODO check limits - set_ccw_limit(2,0x03FF,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(3,0x0000,IMODE_WRITE);//TODO check limits - set_ccw_limit(3,0x03FF,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(4,0x0000,IMODE_WRITE);//TODO check limits - set_ccw_limit(4,0x03FF,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(5,0x0000,IMODE_WRITE);//TODO check limits - set_ccw_limit(5,0x0330,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(6,0x00FF,IMODE_WRITE); - set_ccw_limit(6,0x0330,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(7,0x0000,IMODE_WRITE); - set_ccw_limit(7,0x03FF,IMODE_WRITE); - _delay_ms(100); - set_cw_limit(8,0x0000,IMODE_WRITE); - set_ccw_limit(8,0x03FF,IMODE_WRITE); - -*/ - uint16_t servo_cw_limits[8] = {0, 0, 0, - 0, - 0, + 0x01FF,//4 + 0x01FF,//5 0x00FF, 0, 0}; @@ -261,11 +233,11 @@ uint8_t lower_arm(uint8_t dir){ _delay_ms(200); move_to_angle(6, 0x00FF, 0x03FF,IMODE_WRITE); - _delay_ms(2000); + _delay_ms(900); move_to_angle(4, 0x00FF, 300, IMODE_REG_WRITE); send_action(); - _delay_ms(2000); + _delay_ms(700); move_to_angle(4, 0x00FF, 400, IMODE_REG_WRITE); move_to_angle(3, 0x00A0, 700, IMODE_REG_WRITE); @@ -419,7 +391,7 @@ uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return 1; } - move_to_angle(id, 0x00FF, servo_angle_temp, IMODE_WRITE); + move_to_angle(id, 0x00AF, servo_angle_temp, IMODE_WRITE); return 0; } diff --git a/arm/arm/main.c b/arm/arm/main.c index b73944e8..7c0160f3 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -50,56 +50,29 @@ int main(void){ /************************************************************************/ /* TEST BELOW */ /************************************************************************/ - /**lower_arm(0); - _delay_ms(10000); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - increment_servo(8, 20); - _delay_ms(2000); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - increment_servo(8, -20); - _delay_ms(2000); + lower_arm(1); + _delay_ms(5000); + + arm_forward(); + _delay_ms(300); + arm_forward(); + _delay_ms(300); + arm_forward(); + _delay_ms(300); + arm_forward(); + _delay_ms(300); + arm_forward(); + _delay_ms(300); + raise_arm(); - arm_rotate_default(0x00FF, IMODE_WRITE); - _delay_ms(3000); + _delay_ms(4000); disable_all_torque(); - */ /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ - lower_arm(0); - _delay_ms(8000); - for (int i=0; i<5; i++) - { - increment_servo(8,50); - _delay_ms(500); - decrement_servo(8,30); - _delay_ms(500); - } - - raise_arm(); uint8_t b1, b2, b3,b4,b5,b6,b7,b8; diff --git a/arm/arm/styrmodul6_2.cproj b/arm/arm/styrmodul6_2.cproj index 22033b1b..f68aae9f 100644 --- a/arm/arm/styrmodul6_2.cproj +++ b/arm/arm/styrmodul6_2.cproj @@ -42,6 +42,7 @@ <com_atmel_avrdbg_tool_atmelice> <ToolOptions> <InterfaceProperties> + <IspClock>125000</IspClock> <JtagDbgClock>200000</JtagDbgClock> </InterfaceProperties> <InterfaceName>JTAG</InterfaceName> -- GitLab From a81c72e68725e380d2db7938625ba5738732c9c3 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Thu, 5 Dec 2019 13:52:24 +0100 Subject: [PATCH 17/20] Added functionality for dropping items and made instruction calls return error values --- arm/arm/arm.c | 123 +++++++++++++++++++++++++++++++++----------- arm/arm/arm.h | 14 +++-- arm/arm/main.c | 22 ++------ arm/arm/steering.c | 19 +++++-- arm/arm/steering.h | 1 + arm/arm/styr_komm.c | 98 +++++++++++++++++------------------ arm/arm/styr_komm.h | 2 +- 7 files changed, 171 insertions(+), 108 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index a5b31321..37f5f552 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -17,7 +17,7 @@ uint16_t servo_angle[8]; -uint16_t servo_cw_limits[8] = {0, +uint16_t servo_cw_limits[8] = {818, 0, 0, 0x01FF,//4 @@ -25,7 +25,7 @@ uint16_t servo_cw_limits[8] = {0, 0x00FF, 0, 0}; -uint16_t servo_ccw_limits[8] = {0x03FF,//1 +uint16_t servo_ccw_limits[8] = {818,//1 0x03FF,//2 0x03FF,//3 0x03FF,//4 @@ -139,10 +139,10 @@ uint8_t get_addr(char name[]){ */ uint8_t set_led(uint8_t id, uint16_t led_value, uint8_t imode){ if(led_value != 0 && led_value != 1){ - return 1; + return ERROR_CONSTANT; } write_two_bytes(id, "LED", led_value, 1, imode); - return 0; + return OK_CONSTANT; } /** @@ -193,7 +193,7 @@ void enable_all_torque() { uint8_t raise_arm(){ if(arm_lowered != 1){ - return 1; //Arm is not lowered. Do not raise + return ERROR_CONSTANT; //Arm is not lowered. Do not raise } move_to_angle(2,0x00AF,0x031F,IMODE_REG_WRITE); move_to_angle(5,0x00AF,0x0300,IMODE_REG_WRITE); @@ -202,8 +202,16 @@ uint8_t raise_arm(){ send_action(); _delay_ms(2000); arm_lowered = 0; - return 0; + return OK_CONSTANT; } + +void return_arm(){ + + raise_arm(); + arm_rotate_default(0x00FF,IMODE_WRITE); + disable_all_torque(); +} + /** * Lowers the robot arm to a position where it should be able to pick up stuff * Takes a direction for which side the body should rotate to first, 1 for right, 0 for left @@ -213,7 +221,7 @@ uint8_t raise_arm(){ */ uint8_t lower_arm(uint8_t dir){ if(arm_lowered == 1){ - return 1;//Arm already lowered + return ERROR_CONSTANT;//Arm already lowered } if(dir == 1){ @@ -225,7 +233,7 @@ uint8_t lower_arm(uint8_t dir){ servo_angle[0] = 0x00D5; } else{ - return 1;//Bad dir + return ERROR_CONSTANT;//Bad dir } set_torque(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called @@ -241,17 +249,64 @@ uint8_t lower_arm(uint8_t dir){ move_to_angle(4, 0x00FF, 400, IMODE_REG_WRITE); move_to_angle(3, 0x00A0, 700, IMODE_REG_WRITE); - move_to_angle(8,0x00FF,0x01FF,IMODE_REG_WRITE); send_action(); _delay_ms(1000); move_to_angle(6, 0x00FF, 818,IMODE_REG_WRITE); - move_to_angle(8, 0x00FF, 0x01FF,IMODE_REG_WRITE);//Open claw move_to_angle(7, 0x00FF, 0x01FF, IMODE_REG_WRITE);//Just for default value, this is never changed send_action(); - + _delay_ms(5000); arm_lowered = 1; - return 0; + return OK_CONSTANT; +} + +uint8_t drop_item(uint8_t nr){ + if(nr > 3 || nr < 1){ //The robot will only be able to drop wares at 3 positions + return ERROR_CONSTANT; + } + + lower_arm(1); + for (int i = 0; i < 5; i++) + { + arm_forward(); + } + + switch(nr){ + case 1: + move_to_angle(1, 0x008F, 886, IMODE_WRITE); + break; + case 2: + move_to_angle(1, 0x008F, 818, IMODE_WRITE); + break; + case 3: + move_to_angle(1, 0x008F, 750, IMODE_WRITE); + break; + default: + return ERROR_CONSTANT; + } + _delay_ms(1000); + open_claw(); + _delay_ms(1000); + + for (int i = 0; i < 4; i++) + { + arm_backward(); + } + + _delay_ms(2000); + move_to_angle(1, 0x00AF, 818, IMODE_WRITE); + + _delay_ms(1000); + return_arm(); + +} + +void close_claw(){ + move_to_angle(CLAW_ID, 0x00FF, 200, IMODE_WRITE); +} + +void open_claw(){ + move_to_angle(CLAW_ID, 0x00FF, 0x01FF, IMODE_WRITE); } /** @@ -261,7 +316,7 @@ uint8_t lower_arm(uint8_t dir){ */ uint8_t arm_forward(){ if(arm_lowered != 1){ - return 1; //Don't call if not lowered + return ERROR_CONSTANT; //Don't call if not lowered } if( (servo_angle[5]-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached @@ -282,7 +337,7 @@ uint8_t arm_forward(){ move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); _delay_ms(100); send_action(); - return 0; + return OK_CONSTANT; } /** @@ -293,7 +348,7 @@ uint8_t arm_forward(){ */ uint8_t arm_backward(){ if(arm_lowered != 1){ - return 1; + return ERROR_CONSTANT; } if( (servo_angle[5]+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached @@ -312,9 +367,9 @@ uint8_t arm_backward(){ move_to_angle(6, 0x00FF, servo_angle[5], IMODE_REG_WRITE); move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); - _delay_ms(100); + _delay_ms(200); send_action(); - return 0; + return OK_CONSTANT; } @@ -329,9 +384,9 @@ uint8_t arm_backward(){ * Returns a non-zero value on failure */ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_t imode){ - if(id == ALL_SERVOS || (id == 1 && arm_lowered)){ // Please don't. + if(id == ALL_SERVOS){ // Please don't. // Don't rotate the arm when arm is down - return 1; + return ERROR_CONSTANT; } uint8_t lower_byte_pos = goal_position& 0xFF; @@ -374,43 +429,51 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ servo_angle[id-1] = goal_position; send_instruction(id, imode, params, 5); } - return 0; + + return OK_CONSTANT; +} + +uint8_t move_and_send_action(uint8_t id, uint16_t speed, uint16_t goal_position){ + uint8_t return_status = move_to_angle(id, speed, goal_position, IMODE_REG_WRITE);//arg1 is id arg2 is goal_position + send_action();//Always send_action since we might call a pair of servos + return return_status; } -void arm_rotate_90_left(uint16_t speed,uint8_t imode){ - move_to_angle(1, speed, 0x00D5,imode); + +uint8_t arm_rotate_90_left(uint16_t speed,uint8_t imode){ + return move_to_angle(1, speed, 0x00D5,imode); } -void arm_rotate_90_right(uint16_t speed,uint8_t imode){ - move_to_angle(1, speed, 0x0332,imode); +uint8_t arm_rotate_90_right(uint16_t speed,uint8_t imode){ + return move_to_angle(1, speed, 0x0332,imode); } uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { volatile uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; volatile test = 1; if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { - return 1; + return ERROR_CONSTANT; } move_to_angle(id, 0x00AF, servo_angle_temp, IMODE_WRITE); - return 0; + return OK_CONSTANT; } uint8_t decrement_servo(uint8_t id, uint16_t delta_angle) { volatile uint16_t servo_angle_temp = servo_angle[id-1] - delta_angle; volatile test = 1; if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { - return 1; + return ERROR_CONSTANT; } move_to_angle(id, 0x00FF, servo_angle_temp, IMODE_WRITE); - return 0; + return OK_CONSTANT; } /** * Returns the arm to its "resting position". * Used after item has been grabbed and the car is about to drive. */ -void arm_rotate_default(uint16_t speed,uint8_t imode){ - move_to_angle(1, speed, 0x01FF,imode); +uint8_t arm_rotate_default(uint16_t speed,uint8_t imode){ + return move_to_angle(1, speed, 0x01FF,imode); } /** diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 1dbcf880..daa2c154 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -26,7 +26,7 @@ #define SERVO_4_UPPER_LIMIT 0x03FF #define SERVO_4_LOWER_LIMIT 0x0000 -#define ARM_FORWARD_DELTA 10 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled +#define ARM_FORWARD_DELTA 20 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo @@ -36,6 +36,8 @@ #define SERVO_90_RIGHT 205 //Position for 90 degrees to the right #define SERVO_90_LEFT 818 //Position for 90 degrees to the left +#define ERROR_CONSTANT 254 +#define OK_CONSTANT 255 uint8_t get_addr(char name[]); @@ -79,15 +81,19 @@ void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode); void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode); uint8_t raise_arm(); uint8_t lower_arm(uint8_t dir); -void arm_rotate_90_right(uint16_t speed,uint8_t imode); -void arm_rotate_90_left(uint16_t speed,uint8_t imode); +uint8_t arm_rotate_90_right(uint16_t speed,uint8_t imode); +uint8_t arm_rotate_90_left(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); uint8_t arm_forward(); uint8_t arm_backward(); -void arm_rotate_default(uint16_t speed,uint8_t imode); +uint8_t arm_rotate_default(uint16_t speed,uint8_t imode); void enable_all_torque(); uint8_t increment_servo(uint8_t id, uint16_t delta_angle); void disable_all_torque(); uint8_t decrement_servo(uint8_t id, uint16_t delta_angle); +void close_claw(); +uint8_t drop_item(uint8_t nr); +void open_claw(); +uint8_t move_and_send_action(uint8_t id, uint16_t speed, uint16_t goal_position); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 7c0160f3..8df79725 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -50,23 +50,7 @@ int main(void){ /************************************************************************/ /* TEST BELOW */ /************************************************************************/ - lower_arm(1); - _delay_ms(5000); - - arm_forward(); - _delay_ms(300); - arm_forward(); - _delay_ms(300); - arm_forward(); - _delay_ms(300); - arm_forward(); - _delay_ms(300); - arm_forward(); - _delay_ms(300); - - raise_arm(); - _delay_ms(4000); - disable_all_torque(); + /************************************************************************/ /* TEST ABOVE */ @@ -80,8 +64,8 @@ int main(void){ b1 = getchar(); b2 = getchar(); b3 = getchar(); - translate_instruction(b1,b2,b3); - putchar(255); + putchar(translate_instruction(b1,b2,b3)); + } diff --git a/arm/arm/steering.c b/arm/arm/steering.c index 959f1ade..3abb57af 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -11,6 +11,8 @@ #define bit_set(port, bit) (port) |= (1<<(bit)) #define bit_clear(port, bit) (port) &= ~(1<<(bit)) #define bit_get(port, bit) (port) & (1<<(bit)) +#define ERROR_CONSTANT 254 + #include <avr/io.h> #include <util/delay.h> @@ -92,10 +94,6 @@ void follow_line(int16_t ctrl_signal) { abs_right_dir = (uint8_t) (abs(new_right_speed)); } set_right_speed(abs_right_dir); - - putchar(default_speed); - putchar(left_speed); - putchar(right_speed); } void center_line(int16_t ctrl_signal) { @@ -167,6 +165,7 @@ void toggle_direction(){ void set_speed(uint8_t duty_threshold){ set_left_speed(duty_threshold); set_right_speed(duty_threshold); + } void rotate_right(){ @@ -212,4 +211,16 @@ void small_forward(){ set_speed(DEFAULT_SPEED); _delay_ms(1000); set_speed(0); +} + +uint8_t get_speed(uint8_t side){ + if (side == 1){ + return right_speed; + } + else if (side == 0) + { + return left_speed; + } + return ERROR_CONSTANT; + } \ No newline at end of file diff --git a/arm/arm/steering.h b/arm/arm/steering.h index 99e53bb5..de0ca7d7 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -46,6 +46,7 @@ void drive_one_block(); void back_one_block(); void set_default_speed(uint8_t duty_threshold); void small_forward(); +uint8_t get_speed(uint8_t side); #endif diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index f3dd75a4..5351c0a2 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -12,6 +12,10 @@ //This is the return value returned when the pi initially asks to identify this unit. #define STYRMODUL_ID 10 +#define INSTRUCTION_NOT_FOUND 253 +#define ERROR_CONSTANT 254 +#define OK_CONSTANT 255 + /** * Executes an instruction according to the given instruction number and the given arguments * @@ -20,124 +24,118 @@ * param arg2: second argument to instruction * */ -void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ +uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ + switch (instr) { case 255: //Identify - putchar(STYRMODUL_ID); + return STYRMODUL_ID; break; case 0: //Forward set_direction(FORWARD); set_speed(arg1); - break; + return OK_CONSTANT; case 1: //Backward set_direction(BACK); set_speed(arg1); - break; + return OK_CONSTANT; case 2://Turn left set_direction(FORWARD); set_right_speed(arg1); set_left_speed(arg1*TURN_CONSTANT); - break; + return OK_CONSTANT; case 3: //Turn right set_direction(FORWARD); set_right_speed(arg1*TURN_CONSTANT); set_left_speed(arg1); - break; + return OK_CONSTANT; case 4: //Rotate left set_speed(arg1); rotate_left(); - break; + return OK_CONSTANT; case 5: //Rotate right set_speed(arg1); rotate_right(); - break; + return OK_CONSTANT; case 6://STOP set_speed(0); - break; + return OK_CONSTANT; case 7://Set driving speed set_speed(arg1); - break; + return OK_CONSTANT; case 8: //move to angle - move_to_angle(arg1, 0x00FF, arg2, IMODE_REG_WRITE);//arg1 is id arg2 is goal_position - send_action();//Always send_action since we might call a pair of servos - break; + return move_and_send_action(arg1, 0x00FF, arg2); case 9: //stop servo set_torque(arg1,0,IMODE_WRITE); - break; + return OK_CONSTANT; case 10: //get angle //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented - break; + return ERROR_CONSTANT; case 11: //get temperature //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented - break; + return ERROR_CONSTANT; case 12: //get voltage //This cant be used for servo 1 - 6 due to technical difficulties, and has been decided to not be implemented - break; + return ERROR_CONSTANT; case 13: //set servo speed set_moving_speed(arg1, arg2, IMODE_WRITE); - break; + return OK_CONSTANT; case 15: //open claw - move_to_angle(CLAW_ID, arg1, 512, IMODE_WRITE); - break; + open_claw(); + return OK_CONSTANT; case 16: //close claw - move_to_angle(CLAW_ID, arg1, 0, IMODE_WRITE);//Right now the claw will close fully, we probably - break; //want it to close halway or something + close_claw();//TODO set to an angle that fits the item we will pickup + return OK_CONSTANT; case 17: // rotate arm left - arm_rotate_90_left(arg1,IMODE_WRITE); - break; + return arm_rotate_90_left(arg1,IMODE_WRITE); case 18: //rotate arm right - arm_rotate_90_right(arg1,IMODE_WRITE); - break; + return arm_rotate_90_right(arg1,IMODE_WRITE); case 19: //arm down - lower_arm(arg1); - break; + return lower_arm(arg1); case 20://arm up - raise_arm(); - break; + return raise_arm(); case 21: //arm forward - arm_forward(); - break; + return arm_forward(); case 22: //arm backward - arm_backward(); - break; + return arm_backward(); case 50: //rotate 90 left rotate_90_left(); - break; + return OK_CONSTANT; case 51: //rotate 90 right - rotate_right(); - break; + rotate_90_right(); + return OK_CONSTANT; case 52: //Small forward small_forward(); - break; + return OK_CONSTANT; case 53: //Disable all torque disable_all_torque(); - break; + return OK_CONSTANT; case 55: //Enable all torque enable_all_torque(); - break; + return OK_CONSTANT; case 54: //Rotate default - arm_rotate_default(arg1,IMODE_WRITE); - break; + return arm_rotate_default(arg1,IMODE_WRITE); case 56: //Increment servo - increment_servo(arg1, INCREMENT_CONSTANT); - break; + return increment_servo(arg1, INCREMENT_CONSTANT); case 57: //Decrement servo - decrement_servo(arg1, INCREMENT_CONSTANT); - break; + return decrement_servo(arg1, INCREMENT_CONSTANT); + case 58: + return drop_item(arg1); + case 59: + return get_speed(arg1); case 100: // Rotate to center line set_speed(120); center_line(update_ctrl_signal((((uint16_t)(arg1)) << 8) + arg2)); - break; + return OK_CONSTANT; case 101: // Read line data follow_line(update_ctrl_signal((((uint16_t)(arg1)) << 8) + arg2)); - break; + return OK_CONSTANT; case 102: // Set default speed set_default_speed(arg1); - break; + return OK_CONSTANT; default: - break; + return ERROR_CONSTANT; } } \ No newline at end of file diff --git a/arm/arm/styr_komm.h b/arm/arm/styr_komm.h index 72d968fb..fab5cd88 100644 --- a/arm/arm/styr_komm.h +++ b/arm/arm/styr_komm.h @@ -10,7 +10,7 @@ #define STYR_KOMM_H_ -void translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2); +uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2); #endif /* STYR_KOMM_H_ */ \ No newline at end of file -- GitLab From 1a4bbb17a7151c7dff9c8bae094cce6291501fa2 Mon Sep 17 00:00:00 2001 From: Nils Johansson <niljo502@student.liu.se> Date: Mon, 9 Dec 2019 16:25:30 +0100 Subject: [PATCH 18/20] Commmented and cleaned up code --- arm/arm/arm.c | 75 +++++++++++++++++++++++++++++---------------- arm/arm/arm.h | 17 +++------- arm/arm/main.c | 17 +++------- arm/arm/serial.c | 3 +- arm/arm/steering.c | 55 ++++++++++++++++++--------------- arm/arm/steering.h | 5 +-- arm/arm/styr_komm.c | 11 ++++--- 7 files changed, 99 insertions(+), 84 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 37f5f552..d7bdb24f 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -17,15 +17,17 @@ uint16_t servo_angle[8]; -uint16_t servo_cw_limits[8] = {818, - 0, - 0, +//Clockwise and counterclockwise limits for servos 1-8 +uint16_t servo_cw_limits[8] = {818, //1 + 0, //2 + 0, //3 0x01FF,//4 0x01FF,//5 - 0x00FF, - 0, - 0}; -uint16_t servo_ccw_limits[8] = {818,//1 + 0x00FF,//6 + 0, //7 + 0}; //8 + +uint16_t servo_ccw_limits[8] = {818, //1 0x03FF,//2 0x03FF,//3 0x03FF,//4 @@ -191,6 +193,7 @@ void enable_all_torque() { } } +//Raises the arm if it has been lowered to pickup an item uint8_t raise_arm(){ if(arm_lowered != 1){ return ERROR_CONSTANT; //Arm is not lowered. Do not raise @@ -205,8 +208,8 @@ uint8_t raise_arm(){ return OK_CONSTANT; } +//Raises the arm and disables torque so the arm rests in an idle state void return_arm(){ - raise_arm(); arm_rotate_default(0x00FF,IMODE_WRITE); disable_all_torque(); @@ -260,10 +263,20 @@ uint8_t lower_arm(uint8_t dir){ return OK_CONSTANT; } +/** + * Drops an item picked up by the claw at 1 of 3 predefined positions + * takes a uint8_t nr that specifies which position to drop the item at + * meant to be used when the arm has been raised + * + * Returns the arm to an idle position after the item has been dropped + */ uint8_t drop_item(uint8_t nr){ if(nr > 3 || nr < 1){ //The robot will only be able to drop wares at 3 positions return ERROR_CONSTANT; } + if(arm_lowered == 1){//If arm is lowered, return + return ERROR_CONSTANT; + } lower_arm(1); for (int i = 0; i < 5; i++) @@ -319,15 +332,15 @@ uint8_t arm_forward(){ return ERROR_CONSTANT; //Don't call if not lowered } - if( (servo_angle[5]-ARM_FORWARD_DELTA) <= SERVO_6_LOWER_LIMIT){//If overflow or limit is reached - servo_angle[5] = SERVO_6_LOWER_LIMIT; + if( (servo_angle[5]-ARM_FORWARD_DELTA) <= servo_cw_limits[5]){//If limit is reached + servo_angle[5] = servo_cw_limits[5]; } else{ servo_angle[5] = servo_angle[5] - ARM_FORWARD_DELTA; } - if( (servo_angle[3] + ARM_FORWARD_DELTA) >= SERVO_4_UPPER_LIMIT){//If overflow or limit is reached - servo_angle[3] = SERVO_4_UPPER_LIMIT; + if( (servo_angle[3] + ARM_FORWARD_DELTA) >= servo_ccw_limits[3]){//If limit is reached + servo_angle[3] = servo_ccw_limits[3]; } else{ servo_angle[3] = servo_angle[3]+ ARM_FORWARD_DELTA; @@ -351,15 +364,15 @@ uint8_t arm_backward(){ return ERROR_CONSTANT; } - if( (servo_angle[5]+ARM_FORWARD_DELTA) >= SERVO_6_UPPER_LIMIT){//If overflow or limit is reached - servo_angle[5] = SERVO_6_UPPER_LIMIT; + if( (servo_angle[5]+ARM_FORWARD_DELTA) >= servo_ccw_limits[5]){//If limit is reached + servo_angle[5] = servo_ccw_limits[5]; } else{ servo_angle[5] = servo_angle[5] + ARM_FORWARD_DELTA; } - if( servo_angle[3]-ARM_FORWARD_DELTA <= SERVO_4_LOWER_LIMIT){//If overflow or limit is reached - servo_angle[3] = SERVO_4_LOWER_LIMIT; + if( servo_angle[3]-ARM_FORWARD_DELTA <= servo_cw_limits[3]){//If limit is reached + servo_angle[3] = servo_cw_limits[3]; } else{ servo_angle[3] = servo_angle[3] - ARM_FORWARD_DELTA; @@ -389,7 +402,7 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ return ERROR_CONSTANT; } - uint8_t lower_byte_pos = goal_position& 0xFF; + uint8_t lower_byte_pos = goal_position& 0xFF;//Split up arguments into bytes uint8_t higher_byte_pos = goal_position >> 8; uint8_t lower_byte_speed = speed & 0xFF; @@ -399,8 +412,9 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ if (id == 2 || id == 3 || id == 4 || id == 5){//Servo-pairs (2 and 3) and (4 and 5) should always move together with "opposite" goal_position servo_angle[id-1] = goal_position; //Update current servo angle for given servo id - send_instruction(id, IMODE_REG_WRITE, params, 5); + send_instruction(id, IMODE_REG_WRITE, params, 5);//move first servo _delay_ms(200); + uint16_t goal_position_2 = MAX_GOAL_POSITION - goal_position; uint8_t lower_byte_pos_2 = goal_position_2 & 0xFF; uint8_t higher_byte_pos_2 = goal_position_2 >> 8; @@ -433,24 +447,33 @@ uint8_t move_to_angle(uint8_t id, uint16_t speed, uint16_t goal_position, uint8_ return OK_CONSTANT; } +// Function that calls move_to_angle with IMODE_REG_WRITE and sends an send_action directly after +// returns the returned status by move_to_angle uint8_t move_and_send_action(uint8_t id, uint16_t speed, uint16_t goal_position){ uint8_t return_status = move_to_angle(id, speed, goal_position, IMODE_REG_WRITE);//arg1 is id arg2 is goal_position send_action();//Always send_action since we might call a pair of servos return return_status; } - + /* + * Rotates servo 1 to a position where the arm, in its idle state, + * is 90 degrees to the left + */ uint8_t arm_rotate_90_left(uint16_t speed,uint8_t imode){ return move_to_angle(1, speed, 0x00D5,imode); } + /* + * Rotates servo 1 to a position where the arm, in its idle state, + * is 90 degrees to the right + */ uint8_t arm_rotate_90_right(uint16_t speed,uint8_t imode){ return move_to_angle(1, speed, 0x0332,imode); } +//Increments the position of the servo with the given id by the given delta_angle uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { - volatile uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; - volatile test = 1; + uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return ERROR_CONSTANT; } @@ -458,9 +481,9 @@ uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { return OK_CONSTANT; } +//Decrements the position of the servo with the given id by the given delta_angle uint8_t decrement_servo(uint8_t id, uint16_t delta_angle) { - volatile uint16_t servo_angle_temp = servo_angle[id-1] - delta_angle; - volatile test = 1; + uint16_t servo_angle_temp = servo_angle[id-1] - delta_angle; if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return ERROR_CONSTANT; } @@ -488,7 +511,7 @@ void set_ccw_limit(uint8_t id, uint16_t limit, uint8_t imode){ void set_cw_limit(uint8_t id, uint16_t limit, uint8_t imode){ write_two_bytes(id, "CW Angle Limit", limit, 2, imode); } - +//Set return delay of return package void set_return_delay(uint8_t id, uint16_t delay, uint8_t imode){ write_two_bytes(id, "Return Delay Time", delay,1,imode); } @@ -512,7 +535,6 @@ void write_two_bytes(uint8_t id, char *name, uint16_t arg, uint8_t param_len, ui /** - * * param id: servo id * param imode: instruction mode * param params: array of parameters @@ -540,14 +562,13 @@ void send_instruction(uint8_t id, uint8_t imode, uint8_t *params, uint8_t param_ uart_1_putchar(checksum); } - +//Ping a servo with a given id void ping(uint8_t id) { uart_1_putchar(255); //H1 uart_1_putchar(255); //H2 uart_1_putchar(id); //ID uart_1_putchar(2); //LEN uart_1_putchar(1); //INST - //uart_1_putchar(0xFB); uart_1_putchar(0xFF - (id + 2 + 1)); //Checksum calculation } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index daa2c154..facadc0f 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -8,34 +8,27 @@ #ifndef ARM_H_ #define ARM_H_ -#define INSTRUCTION_SET_LENGTH 49 +#define INSTRUCTION_SET_LENGTH 49 //Max instruction address for arm servos #define ALL_SERVOS 0xFE //ID for calling all servos #define CLAW_ID 8 // TODO check id of claw +//Instruction modes #define IMODE_READ 2 #define IMODE_WRITE 3 #define IMODE_REG_WRITE 4 #define IMODE_ACTION 5 +//Max and min position of the AX12 Dynamixel servos #define MAX_GOAL_POSITION 0x03FF #define MIN_GOAL_POSITION 0x0000 -#define SERVO_6_UPPER_LIMIT 0x0330 -#define SERVO_6_LOWER_LIMIT 0x00FF - -#define SERVO_4_UPPER_LIMIT 0x03FF -#define SERVO_4_LOWER_LIMIT 0x0000 - #define ARM_FORWARD_DELTA 20 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo -#define INCREMENT_CONSTANT 10 //Check this - -//TODO test these positions -#define SERVO_90_RIGHT 205 //Position for 90 degrees to the right -#define SERVO_90_LEFT 818 //Position for 90 degrees to the left +#define INCREMENT_CONSTANT 80 //Value used to increment and decrement position of servos +//Return value constants #define ERROR_CONSTANT 254 #define OK_CONSTANT 255 diff --git a/arm/arm/main.c b/arm/arm/main.c index 8df79725..95431976 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -5,19 +5,13 @@ * Author: niljo502 */ -/* -TODO: -1. There might be something wrong with the write_to_servo() and/or send_instruction(). FIXME! -2. Follow the code skeleton in dev/komm in AVR/ECU_unit/src/main.c for correct communicatin with raspi. -3. Write/structure up the arm-interface for easy movement. -*/ - +//Help-functions for accessing and modifying bytes #define bit_set(port, bit) (port) |= (1<<(bit)) #define bit_clear(port, bit) (port) &= ~(1<<(bit)) #define bit_get(port, bit) (port) & (1<<(bit)) #define F_CPU 16000000L -#define BAUD 19200 // for serial 1M +#define BAUD 19200 #include <avr/io.h> @@ -28,9 +22,9 @@ TODO: #include "serial.h" #include "arm.h" - #include "styr_komm.h" +//Setup communication with RaspberryPi FILE uart_output = FDEV_SETUP_STREAM(uart_0_putchar, NULL, _FDEV_SETUP_WRITE); FILE uart_input = FDEV_SETUP_STREAM(NULL, uart_0_getchar, _FDEV_SETUP_READ); @@ -38,8 +32,6 @@ bool cold(); void uart_init(); void uart_arm_init(); -#define BUFFER_SIZE 10 - int main(void){ //cold start. @@ -73,12 +65,13 @@ int main(void){ } -/* HW init. Return true on success, false if some problem occurred. .*/ +/* init function. Return true on success, false if some problem occurred. */ bool cold(){ // Initializes serial communication. uart_init(); uart_arm_init(); + //Initialize steering and arm pwm_init(); servo_init(); diff --git a/arm/arm/serial.c b/arm/arm/serial.c index 52ef7ee5..70f05e47 100644 --- a/arm/arm/serial.c +++ b/arm/arm/serial.c @@ -12,12 +12,13 @@ #include "serial.h" - +//Write one byte to UART stream void uart_0_putchar(char c, FILE *stream){ loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = c; } +//Read one byte from UART stream char uart_0_getchar(FILE *stream){ loop_until_bit_is_set(UCSR0A, RXC0); return UDR0; diff --git a/arm/arm/steering.c b/arm/arm/steering.c index 3abb57af..a9a5bb0b 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -13,11 +13,9 @@ #define bit_get(port, bit) (port) & (1<<(bit)) #define ERROR_CONSTANT 254 - #include <avr/io.h> #include <util/delay.h> #include <stdbool.h> - #include "steering.h" uint8_t right_speed = 0;//Current speed of the right wheel pair @@ -33,6 +31,7 @@ enum Direction DEFAULT_DIR = FORWARD; * The range of the error values are: -32768 to 32767 * -32768 < left < 0 < right < 32767 **/ + int16_t prev_error; /** @@ -121,17 +120,11 @@ void set_left_speed(uint8_t duty_threshold){ left_speed = duty_threshold; } -void toggle_right_direction(){ - PORTB ^= _BV(0);//toggle bit - right_dir = !right_dir; -} - -void toggle_left_direction(){ - PORTB ^= _BV(1);//toggle bit - left_dir = !left_dir; -} - +//Set direction of left wheel pair void set_left_direction(enum Direction dir){ + if(dir != 0 && dir != 1){ + return; + } if (dir == FORWARD){ bit_set(PORTB, 0); } @@ -139,9 +132,11 @@ void set_left_direction(enum Direction dir){ bit_clear(PORTB, 0); } } - +//Set direction of right wheel pair void set_right_direction(enum Direction dir){ - + if(dir != 0 && dir != 1){ + return; + } if (dir == FORWARD){ bit_clear(PORTB, 1); } @@ -150,34 +145,37 @@ void set_right_direction(enum Direction dir){ } } +//Sets the direction of both wheel pairs to the given dir void set_direction(enum Direction dir){ set_right_direction(dir); set_left_direction(dir); } -void toggle_direction(){ - toggle_left_direction(); - toggle_right_direction(); -} - -//Valid range for duty_threshhold is 0-255 -//Use higher threshold for higher speed +/** + * Takes a compare value duty_threshold whisch is used to generate the PWM-signal + * Valid range for duty_threshhold is 0-255 + * Use higher threshold for higher speed + */ void set_speed(uint8_t duty_threshold){ set_left_speed(duty_threshold); set_right_speed(duty_threshold); } +//Sets the direction of the wheels to oposite directions so the robot will rotate to the left void rotate_right(){ set_left_direction(FORWARD); set_right_direction(BACK); } +//Sets the direction of the wheels to oposite directions so the robot will rotate to the right void rotate_left(){ set_left_direction(BACK); set_right_direction(FORWARD); } + +//Rotates the robot 90 degrees to the left void rotate_90_left(){//TODO test and adjust so it actually rotates 90 degrees set_speed(DEFAULT_ROTATE_SPEED); rotate_left(); @@ -186,6 +184,7 @@ void rotate_90_left(){//TODO test and adjust so it actually rotates 90 degrees set_speed(DEFAULT_SPEED); } +//Rotates the robot 90 degrees to the right void rotate_90_right(){//TODO test and adjust so it actually rotates 90 degrees set_speed(DEFAULT_ROTATE_SPEED); rotate_right(); @@ -194,11 +193,15 @@ void rotate_90_right(){//TODO test and adjust so it actually rotates 90 degrees set_speed(DEFAULT_SPEED); } +//Drives the robot on block forward +//One block is about 1 meter void drive_one_block(){ set_speed(DEFAULT_SPEED); _delay_ms(DRIVE_ONE_BLOCK_DELAY); } +//Function that drives the robot one "block" backward +//One block is about 1 meter void back_one_block(){ set_direction(BACK); set_speed(DEFAULT_SPEED); @@ -206,19 +209,23 @@ void back_one_block(){ set_direction(FORWARD); } +//Function that drives the robot a small distance forward void small_forward(){ set_direction(FORWARD); set_speed(DEFAULT_SPEED); _delay_ms(1000); set_speed(0); } - +/** + * Returns the the compare value used for PWM-signal generation for + * The right wheel pair if given side is 1 + * The left wheel pair if given side is 0 + */ uint8_t get_speed(uint8_t side){ if (side == 1){ return right_speed; } - else if (side == 0) - { + else if (side == 0){ return left_speed; } return ERROR_CONSTANT; diff --git a/arm/arm/steering.h b/arm/arm/steering.h index de0ca7d7..c277c474 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -14,7 +14,7 @@ enum Direction{BACK, FORWARD}; #define DEFAULT_SPEED 100 #define DEFAULT_ROTATE_SPEED 100 -#define TURN_CONSTANT 0.5 +#define TURN_CONSTANT 0.2 #define ROTATE_90_DELAY 2000 #define DRIVE_ONE_BLOCK_DELAY 3400 #define TEST_SPEED 80 @@ -31,12 +31,9 @@ void center_line(int16_t ctrl_signal); void set_right_speed(uint8_t duty_threshold); void set_left_speed(uint8_t duty_threshold); -void toggle_right_direction(); -void toggle_left_direction(); void set_left_direction(enum Direction dir); void set_right_direction(enum Direction dir); void set_direction(enum Direction dir); -void toggle_direction(); void set_speed(uint8_t duty_threshold); void rotate_right(); void rotate_left(); diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 5351c0a2..12b0d997 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -12,9 +12,10 @@ //This is the return value returned when the pi initially asks to identify this unit. #define STYRMODUL_ID 10 -#define INSTRUCTION_NOT_FOUND 253 +//Values returned to the PI #define ERROR_CONSTANT 254 #define OK_CONSTANT 255 +#define SPEED_CONSTANT 250 /** * Executes an instruction according to the given instruction number and the given arguments @@ -92,7 +93,7 @@ uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ case 19: //arm down return lower_arm(arg1); case 20://arm up - return raise_arm(); + return return_arm(); case 21: //arm forward return arm_forward(); case 22: //arm backward @@ -120,8 +121,10 @@ uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ return decrement_servo(arg1, INCREMENT_CONSTANT); case 58: return drop_item(arg1); - case 59: - return get_speed(arg1); + case 59://Returns both speeds of the wheel pairs. First the left speed then the right. + putchar(SPEED_CONSTANT); + putchar(get_speed(0)); + return(get_speed(1)); case 100: // Rotate to center line set_speed(120); -- GitLab From 6cc383c19ef934fe1bb1c1e8e5dc565f3cef7672 Mon Sep 17 00:00:00 2001 From: Jonatan Jonsson <jonjo049@student.liu.se> Date: Wed, 11 Dec 2019 11:33:28 +0100 Subject: [PATCH 19/20] fixed raise arm, maybe --- arm/arm/arm.c | 91 ++++++++++++++++++++++++++++++++++++--------- arm/arm/arm.h | 11 ++++-- arm/arm/main.c | 2 +- arm/arm/styr_komm.c | 12 ++++-- 4 files changed, 90 insertions(+), 26 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index d7bdb24f..64433897 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -18,16 +18,16 @@ uint16_t servo_angle[8]; //Clockwise and counterclockwise limits for servos 1-8 -uint16_t servo_cw_limits[8] = {818, //1 - 0, //2 - 0, //3 - 0x01FF,//4 - 0x01FF,//5 +uint16_t servo_cw_limits[8] = {778, //1 + 20, //2 was 0 + 20, //3 was 0 + 0x0020,//4 was 01FF + 0x0020,//5 was 01FF 0x00FF,//6 0, //7 0}; //8 -uint16_t servo_ccw_limits[8] = {818, //1 +uint16_t servo_ccw_limits[8] = {858, //1 0x03FF,//2 0x03FF,//3 0x03FF,//4 @@ -37,6 +37,8 @@ uint16_t servo_ccw_limits[8] = {818, //1 0x03FF}; uint8_t arm_lowered = 0; //1 if instruction arm_forward should be callable 0 if not +uint8_t arm_lowered_right = 0; +uint8_t arm_lowered_left = 0; //Array of instruction names. The index of the instruction string is the address of the instruction. const char INSTRUCTIONS [INSTRUCTION_SET_LENGTH][32] = { @@ -194,7 +196,7 @@ void enable_all_torque() { } //Raises the arm if it has been lowered to pickup an item -uint8_t raise_arm(){ +uint8_t retract_arm(){ if(arm_lowered != 1){ return ERROR_CONSTANT; //Arm is not lowered. Do not raise } @@ -205,12 +207,14 @@ uint8_t raise_arm(){ send_action(); _delay_ms(2000); arm_lowered = 0; + arm_lowered_right = 0; + arm_lowered_left = 0; return OK_CONSTANT; } //Raises the arm and disables torque so the arm rests in an idle state void return_arm(){ - raise_arm(); + retract_arm(); arm_rotate_default(0x00FF,IMODE_WRITE); disable_all_torque(); } @@ -222,24 +226,27 @@ void return_arm(){ * * Returns a non-zero value on failure */ -uint8_t lower_arm(uint8_t dir){ +uint8_t extend_arm(uint8_t dir){ if(arm_lowered == 1){ return ERROR_CONSTANT;//Arm already lowered } if(dir == 1){ - arm_rotate_90_right(0x00FF, IMODE_WRITE); + arm_rotate_90_CCW(0x00FF, IMODE_WRITE); servo_angle[0] = 0x0332; + arm_lowered_left = 1; + } else if(dir == 0){ - arm_rotate_90_left(0x00FF,IMODE_WRITE); + arm_rotate_90_CW(0x00FF,IMODE_WRITE); servo_angle[0] = 0x00D5; + arm_lowered_right = 1; } else{ return ERROR_CONSTANT;//Bad dir } - set_torque(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when raise_arm is called + set_torque(2,1,IMODE_WRITE);//Since we disable the torque on servo 2 and 3 when retract_arm is called set_torque(3,1,IMODE_WRITE);//we make sure that they are enabled here _delay_ms(200); @@ -278,7 +285,7 @@ uint8_t drop_item(uint8_t nr){ return ERROR_CONSTANT; } - lower_arm(1); + extend_arm(1); for (int i = 0; i < 5; i++) { arm_forward(); @@ -385,6 +392,53 @@ uint8_t arm_backward(){ return OK_CONSTANT; } +uint8_t lower_arm() { + if (arm_lowered != 1) { + return ERROR_CONSTANT; + } + + if (servo_angle[3]+ARM_FORWARD_DELTA >= servo_ccw_limits[3]){//If limit is reached + servo_angle[3] = servo_ccw_limits[3]; + } else { + servo_angle[3] = servo_angle[3] + ARM_FORWARD_DELTA; + } + + if (servo_angle[2]+ARM_FORWARD_DELTA >= servo_ccw_limits[2]){//If limit is reached + servo_angle[2] = servo_ccw_limits[2]; + } else { + servo_angle[2] = servo_angle[2] + ARM_FORWARD_DELTA; + } + + move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); + move_to_angle(3, 0x00FF, servo_angle[2], IMODE_REG_WRITE); + _delay_ms(200); + send_action(); + return OK_CONSTANT; +} + +uint8_t raise_arm() { + if (arm_lowered != 1) { + return ERROR_CONSTANT; + } + + if (servo_angle[3]-ARM_FORWARD_DELTA <= servo_cw_limits[3]){//If limit is reached + servo_angle[3] = servo_cw_limits[3]; + } else { + servo_angle[3] = servo_angle[3] - ARM_FORWARD_DELTA; + } + + if (servo_angle[2]-ARM_FORWARD_DELTA <= servo_cw_limits[2]){//If limit is reached + servo_angle[2] = servo_cw_limits[2]; + } else { + servo_angle[2] = servo_angle[2] - ARM_FORWARD_DELTA; + } + + move_to_angle(4, 0x00FF, servo_angle[3], IMODE_REG_WRITE); + move_to_angle(3, 0x00FF, servo_angle[2], IMODE_REG_WRITE); + _delay_ms(200); + send_action(); + return OK_CONSTANT; +} /** * Moves the servo with the given id to a given goal position with the given speed @@ -457,23 +511,26 @@ uint8_t move_and_send_action(uint8_t id, uint16_t speed, uint16_t goal_position) /* * Rotates servo 1 to a position where the arm, in its idle state, - * is 90 degrees to the left + * The arm can be lowered on the right side. */ -uint8_t arm_rotate_90_left(uint16_t speed,uint8_t imode){ +uint8_t arm_rotate_90_CW(uint16_t speed,uint8_t imode){ return move_to_angle(1, speed, 0x00D5,imode); } /* * Rotates servo 1 to a position where the arm, in its idle state, - * is 90 degrees to the right + * The arm can be lowered on the left side. */ -uint8_t arm_rotate_90_right(uint16_t speed,uint8_t imode){ +uint8_t arm_rotate_90_CCW(uint16_t speed,uint8_t imode){ return move_to_angle(1, speed, 0x0332,imode); } //Increments the position of the servo with the given id by the given delta_angle uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; + + //TODO: fix so that the limits for id 1 are inverted for the left side when incrementing!!!!!!!!!!!!! + if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return ERROR_CONSTANT; } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index facadc0f..495e17ea 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -23,6 +23,7 @@ #define MIN_GOAL_POSITION 0x0000 #define ARM_FORWARD_DELTA 20 // How much servo 4 and 6 should be moved forward/backward when arm_forward()/backward is caled +#define ARM_RAISE_DELTA 10 #define REST_POSITION_SERVO_1 0x01FF //Middle position of servo @@ -72,10 +73,10 @@ void send_instruction(uint8_t id, uint8_t imode, uint8_t *params, uint8_t param_ void set_return_delay(uint8_t id, uint16_t delay, uint8_t imode); void set_max_torque(uint8_t id, uint16_t torque, uint8_t imode); void set_baud_rate(uint8_t id, uint16_t baud_rate, uint8_t imode); -uint8_t raise_arm(); -uint8_t lower_arm(uint8_t dir); -uint8_t arm_rotate_90_right(uint16_t speed,uint8_t imode); -uint8_t arm_rotate_90_left(uint16_t speed,uint8_t imode); +uint8_t retract_arm(); +uint8_t extend_arm(uint8_t dir); +uint8_t arm_rotate_90_CW(uint16_t speed,uint8_t imode); +uint8_t arm_rotate_90_CCW(uint16_t speed,uint8_t imode); void torque_enable(uint8_t id, uint16_t enable, uint8_t imode); uint8_t arm_forward(); uint8_t arm_backward(); @@ -88,5 +89,7 @@ void close_claw(); uint8_t drop_item(uint8_t nr); void open_claw(); uint8_t move_and_send_action(uint8_t id, uint16_t speed, uint16_t goal_position); +uint8_t raise_arm(); +uint8_t lower_arm(); #endif // ARM_H_ \ No newline at end of file diff --git a/arm/arm/main.c b/arm/arm/main.c index 95431976..a448ef3b 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -43,7 +43,7 @@ int main(void){ /* TEST BELOW */ /************************************************************************/ - + /************************************************************************/ /* TEST ABOVE */ /************************************************************************/ diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index 12b0d997..df06f9f0 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -87,17 +87,21 @@ uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ close_claw();//TODO set to an angle that fits the item we will pickup return OK_CONSTANT; case 17: // rotate arm left - return arm_rotate_90_left(arg1,IMODE_WRITE); + return arm_rotate_90_CW(arg1,IMODE_WRITE); case 18: //rotate arm right - return arm_rotate_90_right(arg1,IMODE_WRITE); + return arm_rotate_90_CCW(arg1,IMODE_WRITE); case 19: //arm down - return lower_arm(arg1); - case 20://arm up + return extend_arm(arg1); + case 20://return, rotate and torque return return_arm(); case 21: //arm forward return arm_forward(); case 22: //arm backward return arm_backward(); + case 23: //raise arm + return raise_arm(); + case 24: //lower arm + return lower_arm(); case 50: //rotate 90 left rotate_90_left(); return OK_CONSTANT; -- GitLab From bf7b93b5868302c001c3c71b61918cb38fa9f6bf Mon Sep 17 00:00:00 2001 From: jonjo049 <jonjo049@student.liu.se> Date: Thu, 12 Dec 2019 15:20:53 +0100 Subject: [PATCH 20/20] Added header to documents --- arm/arm/arm.c | 27 ++++--- arm/arm/arm.h | 10 +-- arm/arm/main.c | 10 +-- arm/arm/steering.c | 10 +-- arm/arm/steering.h | 10 +-- arm/arm/styr_komm.c | 14 ++-- arm/arm/styr_komm.h | 10 +-- arm/arm/styrmodul.cproj | 162 ++++++++++++++++++++-------------------- 8 files changed, 130 insertions(+), 123 deletions(-) diff --git a/arm/arm/arm.c b/arm/arm/arm.c index 64433897..67e34fb3 100644 --- a/arm/arm/arm.c +++ b/arm/arm/arm.c @@ -1,9 +1,10 @@ /* - * avr_to_arm_uart.c - * - * Created: 2019-11-15 14:28:20 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ + #define F_CPU 16000000L #include <avr/io.h> @@ -18,7 +19,7 @@ uint16_t servo_angle[8]; //Clockwise and counterclockwise limits for servos 1-8 -uint16_t servo_cw_limits[8] = {778, //1 +uint16_t servo_cw_limits[8] = {750, //1 20, //2 was 0 20, //3 was 0 0x0020,//4 was 01FF @@ -27,12 +28,12 @@ uint16_t servo_cw_limits[8] = {778, //1 0, //7 0}; //8 -uint16_t servo_ccw_limits[8] = {858, //1 +uint16_t servo_ccw_limits[8] = {880, //1 0x03FF,//2 0x03FF,//3 0x03FF,//4 0x03FF,//5 - 0x0330,//6 + 818,//6 0x03FF,//7 0x03FF}; @@ -529,11 +530,15 @@ uint8_t arm_rotate_90_CCW(uint16_t speed,uint8_t imode){ uint8_t increment_servo(uint8_t id, uint16_t delta_angle) { uint16_t servo_angle_temp = servo_angle[id-1] + delta_angle; - //TODO: fix so that the limits for id 1 are inverted for the left side when incrementing!!!!!!!!!!!!! - - if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { + /* + if (id = 1 && arm_lowered_right == 1 && servo_angle_temp < (MAX_GOAL_POSITION - servo_ccw_limits[0]) || servo_angle_temp > (MAX_GOAL_POSITION - servo_cw_limits[0])) { + return ERROR_CONSTANT; + } else if (servo_angle_temp < servo_cw_limits[id-1] || servo_angle_temp > servo_ccw_limits[id-1]) { return ERROR_CONSTANT; } + */ + + servo_angle[id-1] = servo_angle_temp; move_to_angle(id, 0x00AF, servo_angle_temp, IMODE_WRITE); return OK_CONSTANT; } diff --git a/arm/arm/arm.h b/arm/arm/arm.h index 495e17ea..0ca4edf0 100644 --- a/arm/arm/arm.h +++ b/arm/arm/arm.h @@ -1,9 +1,9 @@ /* - * avr_to_arm_uart.h - * - * Created: 2019-11-15 14:34:46 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ #ifndef ARM_H_ #define ARM_H_ diff --git a/arm/arm/main.c b/arm/arm/main.c index a448ef3b..6d85dced 100644 --- a/arm/arm/main.c +++ b/arm/arm/main.c @@ -1,9 +1,9 @@ /* - * arm.c - * - * Created: 2019-11-15 10:18:36 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ //Help-functions for accessing and modifying bytes #define bit_set(port, bit) (port) |= (1<<(bit)) diff --git a/arm/arm/steering.c b/arm/arm/steering.c index a9a5bb0b..3f1907bc 100644 --- a/arm/arm/steering.c +++ b/arm/arm/steering.c @@ -1,9 +1,9 @@ /* - * styr.c - * - * Created: 2019-11-13 15:29:24 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ #define F_CPU 16000000UL diff --git a/arm/arm/steering.h b/arm/arm/steering.h index c277c474..521c1f7d 100644 --- a/arm/arm/steering.h +++ b/arm/arm/steering.h @@ -1,9 +1,9 @@ /* - * _steering.h - * - * Created: 2019-11-13 15:31:23 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ #ifndef _steering_h #define _steering_h diff --git a/arm/arm/styr_komm.c b/arm/arm/styr_komm.c index df06f9f0..f1d1557f 100644 --- a/arm/arm/styr_komm.c +++ b/arm/arm/styr_komm.c @@ -1,8 +1,8 @@ /* -* styr_komm.c -* -* Created: 2019-11-21 11:34:02 -* Author: niljo502 +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 */ #include <avr/io.h> @@ -90,9 +90,9 @@ uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ return arm_rotate_90_CW(arg1,IMODE_WRITE); case 18: //rotate arm right return arm_rotate_90_CCW(arg1,IMODE_WRITE); - case 19: //arm down + case 19: //rotate to specified side and extend arm return extend_arm(arg1); - case 20://return, rotate and torque + case 20://return, rotate and torque Off return return_arm(); case 21: //arm forward return arm_forward(); @@ -123,7 +123,7 @@ uint8_t translate_instruction(uint8_t instr, uint8_t arg1, uint8_t arg2){ return increment_servo(arg1, INCREMENT_CONSTANT); case 57: //Decrement servo return decrement_servo(arg1, INCREMENT_CONSTANT); - case 58: + case 58: //dropit return drop_item(arg1); case 59://Returns both speeds of the wheel pairs. First the left speed then the right. putchar(SPEED_CONSTANT); diff --git a/arm/arm/styr_komm.h b/arm/arm/styr_komm.h index fab5cd88..a63f215d 100644 --- a/arm/arm/styr_komm.h +++ b/arm/arm/styr_komm.h @@ -1,9 +1,9 @@ /* - * styr_komm.h - * - * Created: 2019-11-21 11:34:16 - * Author: niljo502 - */ +* Project: RoSS +* Date: 2019-12-12 +* Version 1.0 +* Author: Jonatan Jonsson: jonjo049, Nils Johansson: niljo502 +*/ #ifndef STYR_KOMM_H_ diff --git a/arm/arm/styrmodul.cproj b/arm/arm/styrmodul.cproj index f3856712..7a3e95f3 100644 --- a/arm/arm/styrmodul.cproj +++ b/arm/arm/styrmodul.cproj @@ -27,16 +27,16 @@ <BootSegment>2</BootSegment> <eraseonlaunchrule>0</eraseonlaunchrule> <AsfFrameworkConfig> - <framework-data xmlns=""> - <options /> - <configurations /> - <files /> - <documentation help="" /> - <offline-documentation help="" /> - <dependencies> - <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.19.0" /> - </dependencies> - </framework-data> + <framework-data> + <options /> + <configurations /> + <files /> + <documentation help="" /> + <offline-documentation help="" /> + <dependencies> + <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.39.0" /> + </dependencies> +</framework-data> </AsfFrameworkConfig> <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool> <com_atmel_avrdbg_tool_atmelice> @@ -51,85 +51,87 @@ <ToolName>Atmel-ICE</ToolName> </com_atmel_avrdbg_tool_atmelice> <avrtoolinterface>JTAG</avrtoolinterface> + <ResetRule>0</ResetRule> + <EraseKey /> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Release' "> <ToolchainSettings> <AvrGcc> - <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> - <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> - <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> - <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> - <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> - <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> - <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> - <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> - <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> - <avrgcc.compiler.symbols.DefSymbols> - <ListValues> - <Value>NDEBUG</Value> - </ListValues> - </avrgcc.compiler.symbols.DefSymbols> - <avrgcc.compiler.directories.IncludePaths> - <ListValues> - <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> - </ListValues> - </avrgcc.compiler.directories.IncludePaths> - <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> - <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> - <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> - <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> - <avrgcc.linker.libraries.Libraries> - <ListValues> - <Value>libm</Value> - </ListValues> - </avrgcc.linker.libraries.Libraries> - <avrgcc.assembler.general.IncludePaths> - <ListValues> - <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> - </ListValues> - </avrgcc.assembler.general.IncludePaths> -</AvrGcc> + <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>NDEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.directories.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.compiler.directories.IncludePaths> + <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + <avrgcc.assembler.general.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.assembler.general.IncludePaths> + </AvrGcc> </ToolchainSettings> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ToolchainSettings> <AvrGcc> - <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> - <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> - <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> - <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> - <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> - <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> - <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> - <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> - <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> - <avrgcc.compiler.symbols.DefSymbols> - <ListValues> - <Value>DEBUG</Value> - </ListValues> - </avrgcc.compiler.symbols.DefSymbols> - <avrgcc.compiler.directories.IncludePaths> - <ListValues> - <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> - </ListValues> - </avrgcc.compiler.directories.IncludePaths> - <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level> - <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> - <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> - <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> - <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> - <avrgcc.linker.libraries.Libraries> - <ListValues> - <Value>libm</Value> - </ListValues> - </avrgcc.linker.libraries.Libraries> - <avrgcc.assembler.general.IncludePaths> - <ListValues> - <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> - </ListValues> - </avrgcc.assembler.general.IncludePaths> - <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> -</AvrGcc> + <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device> + <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches> + <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex> + <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss> + <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep> + <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec> + <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures> + <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned> + <avrgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>DEBUG</Value> + </ListValues> + </avrgcc.compiler.symbols.DefSymbols> + <avrgcc.compiler.directories.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.compiler.directories.IncludePaths> + <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level> + <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers> + <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum> + <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel> + <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings> + <avrgcc.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </avrgcc.linker.libraries.Libraries> + <avrgcc.assembler.general.IncludePaths> + <ListValues> + <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value> + </ListValues> + </avrgcc.assembler.general.IncludePaths> + <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel> + </AvrGcc> </ToolchainSettings> </PropertyGroup> <ItemGroup> -- GitLab