Commit from zer0 (2009-03-01 15:43 CET)
================
Add some commands (sensors, cs).
Set the gains + coefs approximatively
aversive_projects microb2009/mainboard/strat_base.c 1.2
aversive_projects microb2009/mainboard/sensor.h 1.3
aversive_projects microb2009/mainboard/sensor.c 1.3
aversive_projects microb2009/mainboard/main.h 1.3
aversive_projects microb2009/mainboard/main.c 1.3
aversive_projects microb2009/mainboard/cs.h 1.2
aversive_projects microb2009/mainboard/cs.c 1.2
aversive_projects microb2009/mainboard/commands_mainboard.c 1.3
aversive_projects microb2009/mainboard/commands_gen.c 1.3
aversive_projects microb2009/mainboard/commands_cs.c 1.3
aversive_projects microb2009/mainboard/commands.c 1.3
===================================================
aversive_projects/microb2009/mainboard/strat_base.c (1.1 -> 1.2)
===================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: strat_base.c,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: strat_base.c,v 1.2 2009-03-01 14:43:16 zer0 Exp $
*
*/
@@ -143,11 +143,11 @@
strat_preinit();
/* if start sw not plugged */
- if (sensor_start_switch()) {
+ if (sensor_get(S_START_SWITCH)) {
printf_P(PSTR("No start switch, press a key or plug it\r\n"));
/* while start sw not plugged */
- while (sensor_start_switch()) {
+ while (sensor_get(S_START_SWITCH)) {
if (cmdline_keypressed()) {
for (i=3; i>0; i--) {
printf_P(PSTR("%d\r\n"), i);
@@ -159,10 +159,10 @@
}
/* if start sw plugged */
- if (!sensor_start_switch()) {
+ if (!sensor_get(S_START_SWITCH)) {
printf_P(PSTR("Ready, unplug start switch to start\r\n"));
/* while start sw plugged */
- while (!sensor_start_switch());
+ while (!sensor_get(S_START_SWITCH));
}
strat_init();
===============================================
aversive_projects/microb2009/mainboard/sensor.h (1.2 -> 1.3)
===============================================
@@ -16,14 +16,43 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: sensor.h,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: sensor.h,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
*/
-#define SENSOR_ADC_COUNT 6
+/* synchronize with sensor.c */
+#define ADC_CSENSE1 0
+#define ADC_CSENSE2 1
+#define ADC_CSENSE3 2
+#define ADC_CSENSE4 3
+#define ADC_BATTERY1 4
+#define ADC_BATTERY2 5
+#define ADC_MAX 6
+
+/* synchronize with sensor.c */
+#define S_START_SWITCH 0
+#define S_CAP2 1
+#define S_CAP3 2
+#define S_CAP4 3
+#define S_CAP5 4
+#define S_CAP6 5
+#define S_CAP7 6
+#define S_CAP8 7
+#define S_RESERVED1 8
+#define S_RESERVED2 9
+#define S_RESERVED3 10
+#define S_RESERVED4 11
+#define S_RESERVED5 12
+#define S_RESERVED6 13
+#define S_RESERVED7 14
+#define S_RESERVED8 15
+#define SENSOR_MAX 16
void sensor_init(void);
-int16_t sensor_read_adc(uint8_t i);
-/* XXX */
-#define sensor_start_switch() 0
+/* get filtered values for adc */
+int16_t sensor_get_adc(uint8_t i);
+
+/* get filtered values of boolean sensors */
+uint16_t sensor_get_all(void);
+uint8_t sensor_get(uint8_t i);
===============================================
aversive_projects/microb2009/mainboard/sensor.c (1.2 -> 1.3)
===============================================
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: sensor.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: sensor.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
*/
@@ -45,6 +45,8 @@
#include "main.h"
#include "sensor.h"
+/************ ADC */
+
struct adc_infos {
uint16_t config;
int16_t value;
@@ -76,41 +78,31 @@
#define ADC_CONF(x) ( ADC_REF_AVCC | ADC_MODE_INT | MUX_ADC##x )
-/* define which ADC to poll, update SENSOR_ADC_COUNT in sensor.h */
-static struct adc_infos adc_infos[SENSOR_ADC_COUNT] = {
-#define ADC_CSENSE1 0
- { .config = ADC_CONF(0), .filter = rii_medium },
-#define ADC_CSENSE2 1
- { .config = ADC_CONF(1), .filter = rii_medium },
-#define ADC_CSENSE3 2
- { .config = ADC_CONF(2), .filter = rii_medium },
-#define ADC_CSENSE4 3
- { .config = ADC_CONF(3), .filter = rii_medium },
-#define ADC_BATTERY 4
- { .config = ADC_CONF(8), .filter = rii_strong },
-#define ADC_CAP6 5
- { .config = ADC_CONF(12) },
+/* define which ADC to poll, see in sensor.h */
+static struct adc_infos adc_infos[ADC_MAX] = {
+ [ADC_CSENSE1] = { .config = ADC_CONF(0), .filter = rii_medium },
+ [ADC_CSENSE2] = { .config = ADC_CONF(1), .filter = rii_medium },
+ [ADC_CSENSE3] = { .config = ADC_CONF(2), .filter = rii_medium },
+ [ADC_CSENSE4] = { .config = ADC_CONF(3), .filter = rii_medium },
+ [ADC_BATTERY1] = { .config = ADC_CONF(8), .filter = rii_strong },
+ [ADC_BATTERY2] = { .config = ADC_CONF(9), .filter = rii_strong },
+
+ /* add adc on "cap" pins if needed */
+/* [ADC_CAP1] = { .config = ADC_CONF(10) }, */
+/* [ADC_CAP2] = { .config = ADC_CONF(11) }, */
+/* [ADC_CAP3] = { .config = ADC_CONF(12) }, */
+/* [ADC_CAP4] = { .config = ADC_CONF(13) }, */
};
static void adc_event(int16_t result);
-/* called every 10 ms */
+/* called every 10 ms, see init below */
static void do_adc(void *dummy)
{
/* launch first conversion */
adc_launch(adc_infos[0].config);
}
-void sensor_init(void)
-{
- adc_init();
- adc_register_event(adc_event);
- /* CS EVENT */
- scheduler_add_periodical_event_priority(do_adc, NULL,
- 10000L / SCHEDULER_UNIT,
- ADC_PRIO);
-}
-
static void adc_event(int16_t result)
{
static uint8_t i = 0;
@@ -123,12 +115,13 @@
adc_infos[i].value = result;
i ++;
- i %= SENSOR_ADC_COUNT;
- if (i != 0)
+ if (i >= ADC_MAX)
+ i = 0;
+ else
adc_launch(adc_infos[i].config);
}
-int16_t sensor_read_adc(uint8_t i)
+int16_t sensor_get_adc(uint8_t i)
{
int16_t tmp;
uint8_t flags;
@@ -138,3 +131,123 @@
IRQ_UNLOCK(flags);
return tmp;
}
+
+/************ boolean sensors */
+
+
+struct sensor_filter {
+ uint8_t filter;
+ uint8_t prev;
+ uint8_t thres_off;
+ uint8_t thres_on;
+ uint8_t cpt;
+};
+
+static struct sensor_filter sensor_filter[SENSOR_MAX] = {
+ [S_START_SWITCH] = { 1, 0, 0, 1, 0 }, /* 0 */
+ [S_CAP2] = { 1, 0, 0, 1, 0 }, /* 1 */
+ [S_CAP3] = { 1, 0, 0, 1, 0 }, /* 2 */
+ [S_CAP4] = { 1, 0, 0, 1, 0 }, /* 3 */
+ [S_CAP5] = { 1, 0, 0, 1, 0 }, /* 4 */
+ [S_CAP6] = { 1, 0, 0, 1, 0 }, /* 5 */
+ [S_CAP7] = { 1, 0, 0, 1, 0 }, /* 6 */
+ [S_CAP8] = { 1, 0, 0, 1, 0 }, /* 7 */
+ [S_RESERVED1] = { 10, 0, 3, 7, 0 }, /* 8 */
+ [S_RESERVED2] = { 10, 0, 3, 7, 0 }, /* 9 */
+ [S_RESERVED3] = { 1, 0, 0, 1, 0 }, /* 10 */
+ [S_RESERVED4] = { 1, 0, 0, 1, 0 }, /* 11 */
+ [S_RESERVED5] = { 1, 0, 0, 1, 0 }, /* 12 */
+ [S_RESERVED6] = { 1, 0, 0, 1, 0 }, /* 13 */
+ [S_RESERVED7] = { 1, 0, 0, 1, 0 }, /* 14 */
+ [S_RESERVED8] = { 1, 0, 0, 1, 0 }, /* 15 */
+};
+
+/* value of filtered sensors */
+static uint16_t sensor_filtered = 0;
+
+/* sensor mapping :
+ * 0-3: PORTK 2->5 (cap1 -> cap4) (adc10 -> adc13)
+ * 4-5: PORTL 0->1 (cap5 -> cap6)
+ * 6-7: PORTE 3->4 (cap7 -> cap8)
+ * 8-15: reserved
+ */
+
+uint16_t sensor_get_all(void)
+{
+ uint16_t tmp;
+ uint8_t flags;
+ IRQ_LOCK(flags);
+ tmp = sensor_filtered;
+ IRQ_UNLOCK(flags);
+ return tmp;
+}
+
+uint8_t sensor_get(uint8_t i)
+{
+ uint16_t tmp = sensor_get_all();
+ return (tmp & _BV(i));
+}
+
+/* get the physical value of pins */
+static uint16_t sensor_read(void)
+{
+ uint16_t tmp = 0;
+ tmp |= (uint16_t)((PINK & (_BV(2)|_BV(3)|_BV(4)|_BV(5))) >> 2) << 0;
+ tmp |= (uint16_t)((PINL & (_BV(0)|_BV(1))) >> 0) << 4;
+ tmp |= (uint16_t)((PINE & (_BV(3)|_BV(4))) >> 3) << 6;
+ /* add reserved sensors here */
+ return tmp;
+}
+
+/* called every 10 ms, see init below */
+static void do_boolean_sensors(void *dummy)
+{
+ uint8_t i;
+ uint8_t flags;
+ uint16_t sensor = sensor_read();
+ uint16_t tmp = 0;
+
+ for (i=0; i<SENSOR_MAX; i++) {
+ if ((1 << i) & sensor) {
+ if (sensor_filter[i].cpt < sensor_filter[i].filter)
+ sensor_filter[i].cpt++;
+ if (sensor_filter[i].cpt >= sensor_filter[i].thres_on)
+ sensor_filter[i].prev = 1;
+ }
+ else {
+ if (sensor_filter[i].cpt > 0)
+ sensor_filter[i].cpt--;
+ if (sensor_filter[i].cpt <= sensor_filter[i].thres_off)
+ sensor_filter[i].prev = 0;
+ }
+
+ if (sensor_filter[i].prev) {
+ tmp |= (1UL << i);
+ }
+ }
+ IRQ_LOCK(flags);
+ sensor_filtered = tmp;
+ IRQ_UNLOCK(flags);
+}
+
+
+
+/************ global sensor init */
+
+/* called every 10 ms, see init below */
+static void do_sensors(void *dummy)
+{
+ do_adc(NULL);
+ do_boolean_sensors(NULL);
+}
+
+void sensor_init(void)
+{
+ adc_init();
+ adc_register_event(adc_event);
+ /* CS EVENT */
+ scheduler_add_periodical_event_priority(do_sensors, NULL,
+ 10000L / SCHEDULER_UNIT,
+ ADC_PRIO);
+}
+
=============================================
aversive_projects/microb2009/mainboard/main.h (1.2 -> 1.3)
=============================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.h,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: main.h,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
*/
@@ -29,11 +29,11 @@
#define BRAKE_ON() do { PORTJ |= 0xF0; } while(0)
#define BRAKE_OFF() do { PORTJ &= 0x0F; } while(0)
-/* it is 90 don't forget it :) */
+/* only 90 seconds, don't forget it :) */
#define MATCH_TIME 90
/* decrease track to decrease angle */
-#define EXT_TRACK_CM 30.0
+#define EXT_TRACK_CM 30.125
#define VIRTUAL_TRACK_CM EXT_TRACK_CM
/* it is a 2048 imps -> 8192 because we see 1/4 period
@@ -46,18 +46,12 @@
#define IMP_COEF 10.
#define DIST_IMP_CM (((IMP_ENCODERS*4)/WHEEL_PERIM_CM)*IMP_COEF)
-/* XXX */
#define LEFT_ENCODER ((void *)1)
#define RIGHT_ENCODER ((void *)2)
-/* XXX */
#define LEFT_PWM ((void *)&gen.pwm3_1B)
#define RIGHT_PWM ((void *)&gen.pwm4_1C)
-/* XXX */
-#define MAINBOARD_MOT_PWM (&gen.pwm4_1C)
-#define MAINBOARD_ENC ((void *)3)
-
/** ERROR NUMS */
#define E_USER_STRAT 194
#define E_USER_I2C_PROTO 195
@@ -120,8 +114,6 @@
/* control systems */
struct cs_block angle;
struct cs_block distance;
- struct cs_block example1;
- struct cs_block example2;
/* x,y positionning */
struct robot_system rs;
=============================================
aversive_projects/microb2009/mainboard/main.c (1.2 -> 1.3)
=============================================
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: main.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
*/
@@ -65,14 +65,6 @@
* BOOTRST : 0 (reset on bootloader)
*/
-/*
- * TODO:
- * circuit VN: il faut le tester et comprendre comment ca marche
- * max232: y a t il eu des modifs ?
- * diode zener sur le Uv : 5.6K et 1K
- * condos sur les LMD
- */
-
struct genboard gen;
struct mainboard mainboard;
@@ -80,12 +72,16 @@
void bootloader(void)
{
+ /* XXX update bootloader to enable the brake */
+ /* XXX don't wait at boot */
+ /* XXX exit when waiting for addr */
#define BOOTLOADER_ADDR 0x3f000
if (pgm_read_byte_far(BOOTLOADER_ADDR) == 0xff) {
printf_P(PSTR("Bootloader is not present\r\n"));
return;
}
cli();
+ BRAKE_ON();
/* ... very specific :( */
TIMSK0 = 0;
TIMSK1 = 0;
@@ -148,7 +144,7 @@
memset(&gen, 0, sizeof(gen));
memset(&mainboard, 0, sizeof(mainboard));
mainboard.flags = DO_ENCODERS | DO_CS | DO_RS |
- DO_POS | DO_POWER; // DO_BD
+ DO_POS; // | DO_POWER; // DO_BD
/* UART */
uart_init();
@@ -227,6 +223,7 @@
sei();
+ printf_P(PSTR("\r\n"));
printf_P(PSTR("Dass das Gluck deinen Haus setzt.\r\n"));
cmdline_interact();
===========================================
aversive_projects/microb2009/mainboard/cs.h (1.1 -> 1.2)
===========================================
@@ -16,8 +16,10 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: cs.h,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: cs.h,v 1.2 2009-03-01 14:43:16 zer0 Exp $
*
*/
void microb_cs_init(void);
+void dump_cs(const char *name, struct cs *cs);
+void dump_pid(const char *name, struct pid_filter *pid);
===========================================
aversive_projects/microb2009/mainboard/cs.c (1.1 -> 1.2)
===========================================
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: cs.c,v 1.1 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: cs.c,v 1.2 2009-03-01 14:43:16 zer0 Exp $
*
*/
@@ -78,10 +78,6 @@
cs_manage(&mainboard.angle.cs);
if (mainboard.distance.on)
cs_manage(&mainboard.distance.cs);
- if (mainboard.example1.on)
- cs_manage(&mainboard.example1.cs);
- if (mainboard.example2.on)
- cs_manage(&mainboard.example2.cs);
}
if ((cpt & 1) && (mainboard.flags & DO_POS)) {
position_manage(&mainboard.pos); /* about 1.5ms (worst case) */
@@ -118,6 +114,25 @@
cpt++;
}
+void dump_cs(const char *name, struct cs *cs)
+{
+ printf_P(PSTR("%s cons=% .5ld fcons=% .5ld err=% .5ld"
+ "in=% .5ld out=% .5ld\r\n"),
+ name, cs_get_consign(cs), cs_get_filtered_consign(cs),
+ cs_get_error(cs), cs_get_filtered_feedback(cs),
+ cs_get_out(cs));
+}
+
+void dump_pid(const char *name, struct pid_filter *pid)
+{
+ printf_P(PSTR("%s P=% .8ld I=% .8ld D=% .8ld out=% .8ld\r\n"),
+ name,
+ pid_get_value_in(pid) * pid_get_gain_P(pid),
+ pid_get_value_I(pid) * pid_get_gain_I(pid),
+ pid_get_value_D(pid) * pid_get_gain_D(pid),
+ pid_get_value_out(pid));
+}
+
void microb_cs_init(void)
{
/* ROBOT_SYSTEM */
@@ -126,9 +141,9 @@
rs_set_right_pwm(&mainboard.rs, pwm_set_and_save, RIGHT_PWM);
/* increase gain to decrease dist, increase left and it will turn more
left */
rs_set_left_ext_encoder(&mainboard.rs, encoders_spi_get_value,
- LEFT_ENCODER, IMP_COEF);
+ LEFT_ENCODER, IMP_COEF * 1.0435);
rs_set_right_ext_encoder(&mainboard.rs, encoders_spi_get_value,
- RIGHT_ENCODER, IMP_COEF);
+ RIGHT_ENCODER, IMP_COEF * 1.0025);
/* rs will use external encoders */
rs_set_flags(&mainboard.rs, RS_USE_EXT);
@@ -143,16 +158,16 @@
trajectory_set_cs(&mainboard.traj, &mainboard.distance.cs,
&mainboard.angle.cs);
trajectory_set_robot_params(&mainboard.traj, &mainboard.rs,
&mainboard.pos);
- trajectory_set_speed(&mainboard.traj, 3000, 3000); /* d, a */
+ trajectory_set_speed(&mainboard.traj, 400, 400); /* d, a */
/* distance window, angle window, angle start */
trajectory_set_windows(&mainboard.traj, 35.0, 5.0, 30.0);
/* ---- CS angle */
/* PID */
pid_init(&mainboard.angle.pid);
- pid_set_gains(&mainboard.angle.pid, 20, 1, 800);
- pid_set_maximums(&mainboard.angle.pid, 0, 30000, 0);
- pid_set_out_shift(&mainboard.angle.pid, 6);
+ pid_set_gains(&mainboard.angle.pid, 500, 10, 7000);
+ pid_set_maximums(&mainboard.angle.pid, 0, 20000, 0);
+ pid_set_out_shift(&mainboard.angle.pid, 10);
pid_set_derivate_filter(&mainboard.angle.pid, 4);
/* QUADRAMP */
@@ -171,9 +186,9 @@
/* ---- CS distance */
/* PID */
pid_init(&mainboard.distance.pid);
- pid_set_gains(&mainboard.distance.pid, 20, 1, 300);
- pid_set_maximums(&mainboard.distance.pid, 0, 30000, 0);
- pid_set_out_shift(&mainboard.distance.pid, 6);
+ pid_set_gains(&mainboard.distance.pid, 500, 10, 7000);
+ pid_set_maximums(&mainboard.distance.pid, 0, 2000, 0);
+ pid_set_out_shift(&mainboard.distance.pid, 10);
pid_set_derivate_filter(&mainboard.distance.pid, 6);
/* QUADRAMP */
@@ -189,26 +204,9 @@
cs_set_process_out(&mainboard.distance.cs, rs_get_distance,
&mainboard.rs);
cs_set_consign(&mainboard.distance.cs, 0);
- /* ---- other CS */
- /* PID */
- pid_init(&mainboard.example1.pid);
- pid_set_gains(&mainboard.example1.pid, 20, 0, 0);
- pid_set_maximums(&mainboard.example1.pid, 0, 30000, 4095);
- pid_set_out_shift(&mainboard.example1.pid, 6);
- pid_set_derivate_filter(&mainboard.example1.pid, 6);
+ mainboard.angle.on = 1;
+ mainboard.distance.on = 1;
- /* QUADRAMP */
- quadramp_init(&mainboard.example1.qr);
- quadramp_set_1st_order_vars(&mainboard.example1.qr, 400, 400); /* set
speed */
- quadramp_set_2nd_order_vars(&mainboard.example1.qr, 5, 5); /* set accel
*/
-
- /* CS */
- cs_init(&mainboard.example1.cs);
- cs_set_consign_filter(&mainboard.example1.cs, quadramp_do_filter,
&mainboard.example1.qr);
- cs_set_correct_filter(&mainboard.example1.cs, pid_do_filter,
&mainboard.example1.pid);
- cs_set_process_in(&mainboard.example1.cs, pwm_ng_set,
MAINBOARD_MOT_PWM);
- cs_set_process_out(&mainboard.example1.cs, encoders_spi_get_value,
MAINBOARD_ENC);
- cs_set_consign(&mainboard.example1.cs, 0);
scheduler_add_periodical_event_priority(do_cs, NULL,
5000L / SCHEDULER_UNIT,
===========================================================
aversive_projects/microb2009/mainboard/commands_mainboard.c (1.2 -> 1.3)
===========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: commands_mainboard.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: commands_mainboard.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
* Olivier MATZ <[email protected]>
*/
@@ -69,6 +69,32 @@
struct cmd_event_result * res = parsed_result;
+ if (!strcmp_P(res->arg1, PSTR("all"))) {
+ bit = DO_ENCODERS | DO_CS | DO_RS | DO_POS |
+ DO_BD | DO_TIMER | DO_POWER;
+ if (!strcmp_P(res->arg2, PSTR("on")))
+ mainboard.flags |= bit;
+ else if (!strcmp_P(res->arg2, PSTR("off")))
+ mainboard.flags &= bit;
+ else { /* show */
+ printf_P(PSTR("encoders is %s\r\n"),
+ (DO_ENCODERS & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("cs is %s\r\n"),
+ (DO_CS & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("rs is %s\r\n"),
+ (DO_RS & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("pos is %s\r\n"),
+ (DO_POS & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("bd is %s\r\n"),
+ (DO_BD & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("timer is %s\r\n"),
+ (DO_TIMER & mainboard.flags) ? "on":"off");
+ printf_P(PSTR("power is %s\r\n"),
+ (DO_POWER & mainboard.flags) ? "on":"off");
+ }
+ return;
+ }
+
if (!strcmp_P(res->arg1, PSTR("encoders")))
bit = DO_ENCODERS;
else if (!strcmp_P(res->arg1, PSTR("cs"))) {
@@ -103,7 +129,7 @@
prog_char str_event_arg0[] = "event";
parse_pgm_token_string_t cmd_event_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_event_result, arg0, str_event_arg0);
-prog_char str_event_arg1[] = "encoders#cs#rs#pos#bd#timer#power";
+prog_char str_event_arg1[] = "all#encoders#cs#rs#pos#bd#timer#power";
parse_pgm_token_string_t cmd_event_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_event_result, arg1, str_event_arg1);
prog_char str_event_arg2[] = "on#off#show";
parse_pgm_token_string_t cmd_event_arg2 = TOKEN_STRING_INITIALIZER(struct
cmd_event_result, arg2, str_event_arg2);
@@ -793,104 +819,52 @@
},
};
+
/**********************************************************/
-/* Sensor */
+/* Rs tests */
-/* this structure is filled when cmd_sensor is parsed successfully */
-struct cmd_sensor_result {
+/* this structure is filled when cmd_rs is parsed successfully */
+struct cmd_rs_result {
fixed_string_t arg0;
fixed_string_t arg1;
};
-/* function called when cmd_sensor is parsed successfully */
-static void cmd_sensor_parsed(void *parsed_result, void *data)
+/* function called when cmd_rs is parsed successfully */
+static void cmd_rs_parsed(void *parsed_result, void *data)
{
-#ifdef notyet
- struct cmd_sensor_result *res = parsed_result;
- uint8_t i;
-
- if (!strcmp_P(res->arg1, PSTR("show"))) {
- printf_P(PSTR("Sensors state:\r\n"
- " %8.8lx\r\n"
- " IR disp=%d\r\n"), mainboard.sensor,
IR_DISP_SENSOR());
- }
- else if (!strcmp_P(res->arg1, PSTR("all_loop"))) { /* show_loop */
- while(uart0_recv_nowait() == -1) {
- for (i=0 ; i<32; i++) {
- if (mainboard.sensor & (1UL<<i))
- printf_P(PSTR("|%.2d"), i);
- else
- printf_P(PSTR(" "));
- }
- if (IR_DISP_SENSOR()) {
- printf_P(PSTR("IR|"));
- }
- else {
- printf_P(PSTR(" |"));
- }
- printf_P(PSTR("\r\n"));
- wait_ms(100);
- }
- }
- else if (!strcmp_P(res->arg1, PSTR("ir_loop"))) { /* show_loop */
- while(uart0_recv_nowait() == -1) {
- if (IR1())
- printf_P(PSTR("LEFT|"));
- else
- printf_P(PSTR(" |"));
- if (IR2())
- printf_P(PSTR("MID-L|"));
- else
- printf_P(PSTR(" |"));
- if (IR3())
- printf_P(PSTR("MID|"));
- else
- printf_P(PSTR(" |"));
- if (IR4())
- printf_P(PSTR("MID-R|"));
- else
- printf_P(PSTR(" |"));
- if (IR5())
- printf_P(PSTR("RIGHT| |"));
- else
- printf_P(PSTR(" | |"));
-
- if (sensor_obstacle())
- printf_P(PSTR("OBSTACLE|"));
- else
- printf_P(PSTR(" |"));
-
- if (strat_obstacle())
- printf_P(PSTR("OBSTACLE IN AREA (%d,%d)|"),
- mainboard.opponent_x,
mainboard.opponent_y);
- else
- printf_P(PSTR(" |"));
- printf_P(PSTR("\r\n"));
- wait_ms(100);
- }
- }
-#endif
+ // struct cmd_rs_result *res = parsed_result;
+ do {
+ printf_P(PSTR("angle cons=% .6ld in=% .6ld out=% .6ld / "),
+ cs_get_consign(&mainboard.angle.cs),
+ cs_get_filtered_feedback(&mainboard.angle.cs),
+ cs_get_out(&mainboard.angle.cs));
+ printf_P(PSTR("distance cons=% .6ld in=% .6ld out=% .6ld / "),
+ cs_get_consign(&mainboard.distance.cs),
+ cs_get_filtered_feedback(&mainboard.distance.cs),
+ cs_get_out(&mainboard.distance.cs));
+ printf_P(PSTR("l=% .4ld r=% .4ld\r\n"), mainboard.pwm_l,
+ mainboard.pwm_r);
+ wait_ms(100);
+ } while(!cmdline_keypressed());
}
-prog_char str_sensor_arg0[] = "sensor";
-parse_pgm_token_string_t cmd_sensor_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_sensor_result, arg0, str_sensor_arg0);
-prog_char str_sensor_arg1[] = "show#all_loop#ir_loop";
-parse_pgm_token_string_t cmd_sensor_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_sensor_result, arg1, str_sensor_arg1);
-
-prog_char help_sensor[] = "Show sensors status";
-parse_pgm_inst_t cmd_sensor = {
- .f = cmd_sensor_parsed, /* function to call */
+prog_char str_rs_arg0[] = "rs";
+parse_pgm_token_string_t cmd_rs_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_rs_result, arg0, str_rs_arg0);
+prog_char str_rs_arg1[] = "show";
+parse_pgm_token_string_t cmd_rs_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_rs_result, arg1, str_rs_arg1);
+
+prog_char help_rs[] = "Show rs (robot system) values";
+parse_pgm_inst_t cmd_rs = {
+ .f = cmd_rs_parsed, /* function to call */
.data = NULL, /* 2nd arg of func */
- .help_str = help_sensor,
+ .help_str = help_rs,
.tokens = { /* token list, NULL terminated */
- (prog_void *)&cmd_sensor_arg0,
- (prog_void *)&cmd_sensor_arg1,
+ (prog_void *)&cmd_rs_arg0,
+ (prog_void *)&cmd_rs_arg1,
NULL,
},
};
-
-
/**********************************************************/
/* Test */
=====================================================
aversive_projects/microb2009/mainboard/commands_gen.c (1.2 -> 1.3)
=====================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: commands_gen.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: commands_gen.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
* Olivier MATZ <[email protected]>
*/
@@ -220,43 +220,6 @@
};
/**********************************************************/
-/* Brakes tests */
-
-/* this structure is filled when cmd_brake is parsed successfully */
-struct cmd_brake_result {
- fixed_string_t arg0;
- fixed_string_t arg1;
-};
-
-/* function called when cmd_brake is parsed successfully */
-static void cmd_brake_parsed(void *parsed_result, void *data)
-{
- struct cmd_brake_result *res = parsed_result;
-
- if (!strcmp_P(res->arg1, PSTR("on")))
- BRAKE_ON();
- else if (!strcmp_P(res->arg1, PSTR("off")))
- BRAKE_OFF();
-}
-
-prog_char str_brake_arg0[] = "brake";
-parse_pgm_token_string_t cmd_brake_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_brake_result, arg0, str_brake_arg0);
-prog_char str_brake_arg1[] = "on#off";
-parse_pgm_token_string_t cmd_brake_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_brake_result, arg1, str_brake_arg1);
-
-prog_char help_brake[] = "Enable/disable brake";
-parse_pgm_inst_t cmd_brake = {
- .f = cmd_brake_parsed, /* function to call */
- .data = NULL, /* 2nd arg of func */
- .help_str = help_brake,
- .tokens = { /* token list, NULL terminated */
- (prog_void *)&cmd_brake_arg0,
- (prog_void *)&cmd_brake_arg1,
- NULL,
- },
-};
-
-/**********************************************************/
/* Adcs tests */
/* this structure is filled when cmd_adc is parsed successfully */
@@ -276,8 +239,8 @@
do {
printf_P(PSTR("ADC values: "));
- for (i=0; i<SENSOR_ADC_COUNT; i++) {
- printf_P(PSTR("%.4d "), sensor_read_adc(i));
+ for (i=0; i<ADC_MAX; i++) {
+ printf_P(PSTR("%.4d "), sensor_get_adc(i));
}
printf_P(PSTR("\r\n"));
wait_ms(100);
@@ -303,6 +266,52 @@
/**********************************************************/
+/* Sensors tests */
+
+/* this structure is filled when cmd_sensor is parsed successfully */
+struct cmd_sensor_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+};
+
+/* function called when cmd_sensor is parsed successfully */
+static void cmd_sensor_parsed(void *parsed_result, void *data)
+{
+ struct cmd_sensor_result *res = parsed_result;
+ uint8_t i, loop = 0;
+
+ if (!strcmp_P(res->arg1, PSTR("loop_show")))
+ loop = 1;
+
+ do {
+ printf_P(PSTR("SENSOR values: "));
+ for (i=0; i<SENSOR_MAX; i++) {
+ printf_P(PSTR("%d "), sensor_get(i));
+ }
+ printf_P(PSTR("\r\n"));
+ wait_ms(100);
+ } while (loop && !cmdline_keypressed());
+}
+
+prog_char str_sensor_arg0[] = "sensor";
+parse_pgm_token_string_t cmd_sensor_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_sensor_result, arg0, str_sensor_arg0);
+prog_char str_sensor_arg1[] = "show#loop_show";
+parse_pgm_token_string_t cmd_sensor_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_sensor_result, arg1, str_sensor_arg1);
+
+prog_char help_sensor[] = "Show sensor values";
+parse_pgm_inst_t cmd_sensor = {
+ .f = cmd_sensor_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_sensor,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_sensor_arg0,
+ (prog_void *)&cmd_sensor_arg1,
+ NULL,
+ },
+};
+
+
+/**********************************************************/
/* Log */
/* this structure is filled when cmd_log is parsed successfully */
====================================================
aversive_projects/microb2009/mainboard/commands_cs.c (1.2 -> 1.3)
====================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: commands_cs.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: commands_cs.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
* Olivier MATZ <[email protected]>
*/
@@ -47,6 +47,7 @@
#include <parse_num.h>
#include "main.h"
+#include "cs.h"
#include "cmdline.h"
struct csb_list {
@@ -56,13 +57,9 @@
prog_char csb_angle_str[] = "angle";
prog_char csb_distance_str[] = "distance";
-prog_char csb_example1_str[] = "example1";
-prog_char csb_example2_str[] = "example2";
struct csb_list csb_list[] = {
{ .name = csb_angle_str, .csb = &mainboard.angle },
{ .name = csb_distance_str, .csb = &mainboard.distance },
- { .name = csb_example1_str, .csb = &mainboard.example1 },
- { .name = csb_example2_str, .csb = &mainboard.example2 },
};
struct cmd_cs_result {
@@ -71,7 +68,7 @@
};
/* token to be used for all cs-related commands */
-prog_char str_csb_name[] = "angle#distance#example1#example2";
+prog_char str_csb_name[] = "angle#distance";
parse_pgm_token_string_t cmd_csb_name_tok = TOKEN_STRING_INITIALIZER(struct
cmd_cs_result, csname, str_csb_name);
struct cs_block *cs_from_name(const char *name)
@@ -111,7 +108,7 @@
if (!show)
pid_set_gains(&csb->pid, res->p, res->i, res->d);
- printf_P(PSTR("%s %s %d %d %d\r\n"),
+ printf_P(PSTR("%s %s %d %d %d\r\n"),
res->cs.cmdname,
res->cs.csname,
pid_get_gain_P(&csb->pid),
@@ -529,13 +526,13 @@
struct cmd_cs_status_result *res = parsed_result;
struct cs_block *csb;
uint8_t loop = 0;
+ uint8_t print_pid = 0, print_cs = 0;
csb = cs_from_name(res->cs.csname);
if (csb == NULL) {
printf_P(PSTR("null csb\r\n"));
return;
}
-
if (strcmp_P(res->arg, PSTR("on")) == 0) {
csb->on = 1;
printf_P(PSTR("%s is on\r\n"), res->cs.csname);
@@ -546,25 +543,34 @@
printf_P(PSTR("%s is off\r\n"), res->cs.csname);
return;
}
- else if (strcmp_P(res->arg, PSTR("loop_show")) == 0)
+ else if (strcmp_P(res->arg, PSTR("show")) == 0) {
+ print_cs = 1;
+ }
+ else if (strcmp_P(res->arg, PSTR("loop_show")) == 0) {
+ loop = 1;
+ print_cs = 1;
+ }
+ else if (strcmp_P(res->arg, PSTR("pid_show")) == 0) {
+ print_pid = 1;
+ }
+ else if (strcmp_P(res->arg, PSTR("pid_loop_show")) == 0) {
+ print_pid = 1;
loop = 1;
+ }
printf_P(PSTR("%s cs is %s\r\n"), res->cs.csname, csb->on ? "on":"off");
do {
- printf_P(PSTR("%s cons=%ld fil_cons=%ld err=%ld feed=%ld
out=%ld\r\n"),
- res->cs.csname,
- cs_get_consign(&csb->cs),
- cs_get_filtered_consign(&csb->cs),
- cs_get_error(&csb->cs),
- cs_get_filtered_feedback(&csb->cs),
- cs_get_out(&csb->cs));
+ if (print_cs)
+ dump_cs(res->cs.csname, &csb->cs);
+ if (print_pid)
+ dump_pid(res->cs.csname, &csb->pid);
wait_ms(100);
} while(loop && !cmdline_keypressed());
}
prog_char str_cs_status_arg0[] = "cs_status";
parse_pgm_token_string_t cmd_cs_status_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_cs_status_result, cs.cmdname, str_cs_status_arg0);
-prog_char str_cs_status_arg[] = "show#loop_show#on#off";
+prog_char str_cs_status_arg[] = "pid_show#pid_loop_show#show#loop_show#on#off";
parse_pgm_token_string_t cmd_cs_status_arg = TOKEN_STRING_INITIALIZER(struct
cmd_cs_status_result, arg, str_cs_status_arg);
prog_char help_cs_status[] = "Show cs status";
=================================================
aversive_projects/microb2009/mainboard/commands.c (1.2 -> 1.3)
=================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: commands.c,v 1.2 2009-02-27 22:23:37 zer0 Exp $
+ * Revision : $Id: commands.c,v 1.3 2009-03-01 14:43:16 zer0 Exp $
*
* Olivier MATZ <[email protected]>
*/
@@ -29,8 +29,8 @@
extern parse_pgm_inst_t cmd_bootloader;
extern parse_pgm_inst_t cmd_encoders;
extern parse_pgm_inst_t cmd_pwm;
-extern parse_pgm_inst_t cmd_brake;
extern parse_pgm_inst_t cmd_adc;
+extern parse_pgm_inst_t cmd_sensor;
extern parse_pgm_inst_t cmd_log;
extern parse_pgm_inst_t cmd_log_show;
extern parse_pgm_inst_t cmd_log_type;
@@ -67,7 +67,7 @@
extern parse_pgm_inst_t cmd_start;
extern parse_pgm_inst_t cmd_interact;
extern parse_pgm_inst_t cmd_color;
-extern parse_pgm_inst_t cmd_sensor;
+extern parse_pgm_inst_t cmd_rs;
extern parse_pgm_inst_t cmd_test;
/* commands_traj.c */
@@ -95,8 +95,8 @@
(parse_pgm_inst_t *)&cmd_bootloader,
(parse_pgm_inst_t *)&cmd_encoders,
(parse_pgm_inst_t *)&cmd_pwm,
- (parse_pgm_inst_t *)&cmd_brake,
(parse_pgm_inst_t *)&cmd_adc,
+ (parse_pgm_inst_t *)&cmd_sensor,
(parse_pgm_inst_t *)&cmd_log,
(parse_pgm_inst_t *)&cmd_log_show,
(parse_pgm_inst_t *)&cmd_log_type,
@@ -132,7 +132,7 @@
(parse_pgm_inst_t *)&cmd_start,
(parse_pgm_inst_t *)&cmd_interact,
(parse_pgm_inst_t *)&cmd_color,
- (parse_pgm_inst_t *)&cmd_sensor,
+ (parse_pgm_inst_t *)&cmd_rs,
(parse_pgm_inst_t *)&cmd_test,
/* commands_traj.c */
Commit from zer0 on branch b_zer0 (2009-03-01 15:44 CET)
=================================
Fix bug introduced by previous commit...
aversive modules/devices/control_system/filters/pid/pid.c 1.5.4.9
=========================================================
aversive/modules/devices/control_system/filters/pid/pid.c (1.5.4.8 -> 1.5.4.9)
=========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pid.c,v 1.5.4.8 2009-02-27 21:32:59 zer0 Exp $
+ * Revision : $Id: pid.c,v 1.5.4.9 2009-03-01 14:44:08 zer0 Exp $
*
*/
@@ -197,7 +197,7 @@
*/
prev_index = p->index + 1;
- if (prev_index > p->derivate_nb_samples)
+ if (prev_index >= p->derivate_nb_samples)
prev_index = 0;
/* saturate input... it influences integral an derivate */
Commit from zer0 (2009-03-01 15:44 CET)
================
s/extension/generic/
aversive_projects microb2009/common/i2c_commands.h 1.3
==================================================
aversive_projects/microb2009/common/i2c_commands.h (1.2 -> 1.3)
==================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: i2c_commands.h,v 1.2 2009-02-20 21:10:01 zer0 Exp $
+ * Revision : $Id: i2c_commands.h,v 1.3 2009-03-01 14:44:36 zer0 Exp $
*
*/
@@ -49,7 +49,7 @@
#define I2C_GENERIC_COLOR_RED 0
#define I2C_GENERIC_COLOR_GREEN 1
-struct i2c_cmd_mechboard_color {
+struct i2c_cmd_generic_color {
struct i2c_cmd_hdr hdr;
uint8_t color;
};
_______________________________________________
Avr-list mailing list
[email protected]
CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive
WIKI : http://wiki.droids-corp.org/index.php/Aversive
DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/
BUGZILLA : http://bugzilla.droids-corp.org
COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog