PIC Cでワクチン君を動かそう


まずはこの回路だけは理解しておかないとプログラムは全く理解できません。



では書いてみよう

プログラム例1 モータの制御をおこなう

2秒ごとに「前進」「後退」「右旋回」「左旋回」を繰り返す
MOTOR関数を次のように定義する。
MOTOR(l,r)においてlは左モータの状態、rは右モータの状態を表し、
1,0,-1 でそれぞれ順回転、停止、逆回転を表す。
したがってMOTOR(1,1) でロボットは前進行動をとる。

//
// example 1
//

#include <16f84.h>
#use delay(clock=10000000)

void MOTOR(int l, int r)
{
if (l==0){output_bit(PIN_A2,0); output_bit(PIN_A3,0);}
else if (l==1){output_bit(PIN_A2,1); output_bit(PIN_A3,0);}
else {output_bit(PIN_A2,0); output_bit(PIN_A3,1);}

if (r==0){output_bit(PIN_A1,0); output_bit(PIN_A0,0);}
else if (r==1){output_bit(PIN_A1,1); output_bit(PIN_A0,0);}
else {output_bit(PIN_A1,0); output_bit(PIN_A0,1);}
}

void main()
{
while(1){
MOTOR(1,1);
delay_ms(2000);
MOTOR(-1,-1);
delay_ms(2000);
MOTOR(1,-1);
delay_ms(2000);
MOTOR(-1,1);
delay_ms(2000);
}
}

プログラム例2 速度制御をおこなう

PWM(Pulse Width Modulation:パルス幅変調)方式によるモータの速度制御をおこなう。
PWMとはモータのオン・オフを高速に行うことで滑らかな速度制御を行うものである。
モータの速度はオン時間とオフ時間の比で決まる。
ここでは「オン時間3ms、オフ時間10msによる低速移動」と「オン時間10ms、オフ時間10msによる高速移動」の2状態を繰り返し行うプログラム例を示す。

//
// example 2
//

#include <16f84.h>
#use delay(clock=10000000)

void MOVE(int on, int off)
{
{output_bit(PIN_A2,1); output_bit(PIN_A3,0);}
{output_bit(PIN_A1,1); output_bit(PIN_A0,0);}
delay_ms(on);
{output_bit(PIN_A2,0); output_bit(PIN_A3,0);}
{output_bit(PIN_A1,0); output_bit(PIN_A0,0);}
delay_ms(off);
}

main(){
int t;

while(1){
for(t=0;t<100;t++) MOVE(3,10);
for(t=0;t<30;t++) MOVE(10,10);
}
}

プログラム例3 底面センサーの活用例

底面4カ所に設けられている赤外線センサー(フォトリフレクタ)の使用例を示す。
ここでは、黒い領域からはみ出ない行動をとるプログラム例を示す。わかりやすくするためにベタ書きのプログラムにしてある。

#include <16f84.h>
#use delay(clock=10000000)

void MOTOR(int l, int r, int t)
{
if (l==0){output_bit(PIN_A2,0); output_bit(PIN_A3,0);}
else if (l==1){output_bit(PIN_A2,1); output_bit(PIN_A3,0);}
else {output_bit(PIN_A2,0); output_bit(PIN_A3,1);}

if (r==0){output_bit(PIN_A1,0); output_bit(PIN_A0,0);}
else if (r==1){output_bit(PIN_A1,1); output_bit(PIN_A0,0);}
else {output_bit(PIN_A1,0); output_bit(PIN_A0,1);}

delay_ms(t);
}

void BOTTOM()
{
short i1,i2,i3,i4;

i1=input(PIN_B4); i2=input(PIN_B5);
i3=input(PIN_B6); i4=input(PIN_B7);

if(!i1 && !i4) MOTOR(-1,-1,200);
if(!i2 && !i3) MOTOR( 1, 1,200);
if(!i1 && i4) {MOTOR(-1,-1,100); MOTOR(1,0,100);}
if(!i4 && i1) {MOTOR(-1,-1,100); MOTOR(0,1,100);}
if(!i2 && i3) {MOTOR( 1, 1,100); MOTOR(1,0,100);}
if(!i3 && i2) {MOTOR( 1, 1,100); MOTOR(0,1,100);}
}

main(){
set_tris_a(0);
set_tris_b(0xf3);
#use fast_io(a)
#use fast_io(b)

port_b_pullups(true);

while(1){
MOTOR(1,1,10);
BOTTOM();
}
}

プログラム例4 前面センサーの活用例

前面のセンサーならびに赤外線発光ダイオードはそれぞれ独立に扱うことができる。
ここでは物体を検知すると、その方向に向かって動くプログラム例を示す。

#include <16f84.h>
#use delay(clock=10000000)

short q,p;

void MOTOR(int l, int r, int t)
{
if (l==0){output_bit(PIN_A2,0); output_bit(PIN_A3,0);}
else if (l==1){output_bit(PIN_A2,1); output_bit(PIN_A3,0);}
else {output_bit(PIN_A2,0); output_bit(PIN_A3,1);}

if (r==0){output_bit(PIN_A1,0); output_bit(PIN_A0,0);}
else if (r==1){output_bit(PIN_A1,1); output_bit(PIN_A0,0);}
else {output_bit(PIN_A1,0); output_bit(PIN_A0,1);}

delay_ms(t);
}

main(){
short i,j;

port_b_pullups(true);

while(1){
output_bit(PIN_B2,1);
output_bit(PIN_B3,1);
delay_us(40);
if(!input(PIN_B0)) i=1; else i=0;
if(!input(PIN_B1)) j=1; else j=0;
output_bit(PIN_B2,0);
output_bit(PIN_B3,0);

MOTOR(j,i,50);
}
}

プログラム例5 プッシュボタンの使用例

ここではプッシュボタンを押した5秒後にロボットが動くプログラムの例を示す。
注意したいのは、このボタンは独立したものではなく、左前方のフォトセンサーのポートと兼用している点である。したがってボタンを押さなくても左前方のセンサーに光信号が入ってしまうと誤動作をする可能性がある。

#include <16f84.h>
#use delay(clock=10000000)

void MOTOR()
{
output_bit(PIN_A2,1); output_bit(PIN_A3,0);
output_bit(PIN_A1,1); output_bit(PIN_A0,0);
}

void WAITING()
{
while(input(PIN_B0)){}
delay_ms(5000); counting
}

main(){
int i;

set_tris_a(0);
set_tris_b(0xf3);
#use fast_io(a)
#use fast_io(b)

port_b_pullups(true);

delay_ms(100);
WAITING();
MOTOR();
}


参考:
スピーカー無しで
モータを使って鳴かせる(音を出させる)関数

void BEEP()

{

int i,j;

for(j=0;j<20;j++){
for(i=0;i<255;i++){

output_bit(PIN_A1,1);output_bit(PIN_A0,0);
output_bit(PIN_A2,1);output_bit(PIN_A3,0);
delay_us(i);
output_bit(PIN_A1,0);output_bit(PIN_A0,1);
output_bit(PIN_A2,0);output_bit(PIN_A3,1);
delay_us(i);

}
}


コンテストのための参考資料”3.3.7拍子”のソースコード


#include <16f84.h>
#use delay(clock=10000000)

void MOTOR(int l, int r, int t)
{
if (l==0){output_bit(PIN_A2,0); output_bit(PIN_A3,0);}
else if (l==1){output_bit(PIN_A2,1); output_bit(PIN_A3,0);}
else {output_bit(PIN_A2,0); output_bit(PIN_A3,1);}

if (r==0){output_bit(PIN_A1,0); output_bit(PIN_A0,0);}
else if (r==1){output_bit(PIN_A1,1); output_bit(PIN_A0,0);}
else {output_bit(PIN_A1,0); output_bit(PIN_A0,1);}

delay_ms(t);
}

void BEAT0(){
MOTOR(0,0,200);
MOTOR(0,0,150);
}

void BEAT1(){
MOTOR(-1,-1,50);
MOTOR(1,1,50);
MOTOR(0,0,200);
}

void BEAT2(){
MOTOR(-1,-1,20);
MOTOR(1,1,20);
MOTOR(0,0,10);
}

main(){
int i,j;

set_tris_a(0);
set_tris_b(0xf3);

port_b_pullups(true);

delay_ms(3000);

while(1){
for(j=0;j<2;j++){
for(i=0;i<3;i++) BEAT1();
BEAT0();
for(i=0;i<3;i++) BEAT1();
BEAT0();
for(i=0;i<7;i++) BEAT1();
BEAT0();
}
for(i=0;i<30;i++) BEAT2();
for(i=0;i<5;i++) BEAT0();
}
}

以上