| 2.2足歩行ロボットの開発2 |
![]() |
![]() |
#include<conio.h>
#include<lnp.h>
#include<dsensor.h>
int main(int argc, char **argv) {
char sendmsg;
ds_active(&SENSOR_3);
ds_rotation_on(&SENSOR_3);
ds_rotation_set(&SENSOR_3,0);
cputs("prop");
while(1){
if(SENSOR_1<0xf000){ // left
sendmsg='d';
}
else if(SENSOR_2<0xf000){ // right
sendmsg='e';
}
else{
sendmsg='f';
}
send_msg(sendmsg);
if(ROTATION_3>=7){ // front
sendmsg='a';
}
else if(ROTATION_3<=-7){ // back
sendmsg='b';
}
else{
sendmsg='c';
}
send_msg(sendmsg);
}
return 0;
}
|
![]() |
| 文字 | RCカーの動作 |
|---|---|
| a | 前進 |
| b | 後退 |
| c | ドライブモーターストップ |
| d | ステアリング左 |
| e | ステアリング右 |
| f | ステアリング中央 |
int main(int argc, char *argv[]) {
cputs("on");
sem_init(&t_motor,0,1);
t_stop=execi(&stop,0,NULL,100,DEFAULT_STACK_SIZE); // make stop task
t_st_stop=execi(&st_stop,0,NULL,90,DEFAULT_STACK_SIZE); // make steering stop task
t_tson=execi(&tson,0,NULL,50,DEFAULT_STACK_SIZE); // make touch task
t_drive=execi(&drive,0,NULL,10,DEFAULT_STACK_SIZE); // make drive task
t_steering=execi(&steering,0,NULL,10,DEFAULT_STACK_SIZE); // make steering task
return 0;
}
|
| 関数名 | 優先度 |
|---|---|
| stop(ストップ関数) | 100 |
| st_stop(ステアリングストップ関数) | 90 |
| tson(タッチセンサー関数) | 50 |
| drive(ドライブ関数) | 10 |
| steering(ステアリング関数) | 0 |
iint drive(){ // drive function
char getmsg;
while(1){
wait_event(&rt_dr_wakeup,0); //wait for lnp_rcx_message
getmsg=lnp_rcx_message;
clear_msg();
sem_wait(&t_motor);
if(getmsg=='a'){
motor_c_speed(MAX_SPEED);
motor_c_dir(rev);
}
else if(getmsg=='b'){
motor_c_speed(MAX_SPEED);
motor_c_dir(fwd);
}
else{
motor_c_dir(off);
}
sem_post(&t_motor);
}
return 0;
}
wakeup_t rt_dr_wakeup(wakeup_t data){ // lnp check for drive func
return lnp_rcx_message=='a' || lnp_rcx_message=='b' || lnp_rcx_message=='c';
}
|
![]() |
int steering(){ // steering function
char getmsg;
ds_active(&SENSOR_2);
ds_rotation_on(&SENSOR_2);
ds_rotation_set(&SENSOR_2,0);
motor_a_speed(MAX_SPEED);
while(1){
wait_event(&rt_st_wakeup,0); //wait for lnp_rcx_message
getmsg=lnp_rcx_message;
clear_msg();
if(getmsg=='d'){
if(ROTATION_2<65){
motor_a_dir(fwd);
msleep(10);
}
else
motor_a_dir(brake);
}
else if(getmsg=='e'){
if(ROTATION_2>-65){
motor_a_dir(rev);
msleep(10);
}
else
motor_a_dir(brake);
}
else if(ROTATION_2<-2){
while(ROTATION_2<=-2){
motor_a_speed(MAX_SPEED/8);
motor_a_dir(fwd);
}
motor_a_dir(brake);
}
else if(ROTATION_2>2){
while(ROTATION_2>=2){
motor_a_speed(MAX_SPEED/8);
motor_a_dir(rev);
}
motor_a_dir(brake);
}
}
return 0;
}
wakeup_t rt_st_wakeup(wakeup_t data){ // lnp check for steering func
return lnp_rcx_message=='d' || lnp_rcx_message=='e' || lnp_rcx_message=='f';
}
|
![]() |
int tson(){ // touch sensor function
motor_c_speed(MAX_SPEED);
while(1){
wait_event(&tson_wakeup,0);
sem_wait(&t_motor);
if(SENSOR_1<0xf000){
motor_c_dir(rev);
msleep(500);
motor_c_dir(brake);
}
else if(SENSOR_3<0xf000){
motor_c_dir(fwd);
msleep(500);
motor_c_dir(brake);
}
sem_post(&t_motor);
}
return 0;
}
wakeup_t tson_wakeup(wakeup_t data){
return SENSOR_1<0xf000 || SENSOR_3<0xf000;
}
|
![]() |
int st_stop(){ // steering stop function
while(1){
wait_event(&rt_wakeup,0);
motor_a_dir(brake);
msleep(50);
}
return 0;
}
wakeup_t rt_wakeup(wakeup_t data){
return ROTATION_2>=65 || ROTATION_2<=-65;
}
|
int stop(){ // rcx stop function
int stopchar;
stopchar=getchar();
if(stopchar==KEY_RUN){
cputs("stop");
killall(100);
}
return 0;
}
|

| 2.2足歩行ロボットの開発 |