多工執行緒的 Arduino 控制
玩玩機器人,設計創意無窮
2021年7月16日 星期五
2020年11月28日 星期六
荷蘭風車 arduino控制
藉由手作荷蘭風車,馬達的部分,以 Arduino晶片控制,搭配按鈕開關,來起閉風車轉動。
其中:
接腳3:偵測按鈕是否按下(高低電位偵測藉以判斷按鈕是否按下),當按下按鈕,高電位;放開按鈕,低電位。
接腳5、6:與L9110馬達驅動板的 A1A、A1B接點連結。
啟動時,因為採用PWM時Arduino會產生額外的低頻噪音,為消除噪音,在程式中,改變計時器的設定。
因為接腳5、6分屬Timer0管轄,在void setup()中增加:
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS00);
OCR0A = 180;
OCR0B = 50;
上開程式碼以紅色色標之處為Timer0的0代號。
如果是採用3、11接腳,則為Timer 2;採用9、10接腳,則為Timer 1。
附上Arduino程式碼:
#define A_1A 6
#define A_1B 5
int button_pin=3;
int i=1;
void setup() {
// put your setup code here, to run once:
TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
TCCR0B = _BV(CS00);
OCR0A = 180;
OCR0B = 50;
pinMode(button_pin,INPUT);
pinMode(A_1A,OUTPUT);
pinMode(A_1B,OUTPUT);
pinMode(13,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
//analogWrite(A_1A,130);
//analogWrite(A_1B,0);
//delay(100);
if (digitalRead(button_pin)==HIGH) {
i=i+1;
while(digitalRead(button_pin)==HIGH){}
}
if (digitalRead(button_pin)==LOW && i%3==0) {
digitalWrite(13,HIGH);
analogWrite(A_1A,150);
digitalWrite(A_1B,0);
delay(20);
}
if (digitalRead(button_pin)==LOW && i%3==1) {
digitalWrite(13,LOW);
analogWrite(A_1A,255);
digitalWrite(A_1B,0);
delay(20);
}
if (digitalRead(button_pin)==LOW && i%3==2) {
digitalWrite(13,LOW);
digitalWrite(A_1A,0);
digitalWrite(A_1B,0);
delay(20);
}
}
2020年10月17日 星期六
2014年12月13日 星期六
從AppInventor2開發產品中,體驗智慧財產的重要
過去國三的電腦課程,通常是上Visual Baic,但對於初次接觸程式設計的孩子來說,一堆抽象的文字語言,數字與字串,或者是運算子,甚至是迴圈的應用,條件式的判斷....光是這些就足以讓孩子們失去學習的信心。
這個學期開始之前,鄭博全老師找我一起商討對於國三學生的課程時談到AppInventor課程,打算在學期中授課,當下我對於這一套軟體並不陌生,因為過去在設計機器人nxt設計時,在進行藍芽連線時,就已經開始使用App Inventor這個軟體作為手機與機器之間的溝通橋樑。
在開始授課的時候,孩子們開始學習圖形化程式設計的操作,崁入式的程式碼建構,相較於傳統的文字程式來說,是淺顯而易懂的。雖然在剛開始還是會排斥著,然而在經過一段時間的學習後,孩子們慢慢地能夠習慣操作,並能慢慢地能夠自己產生一個簡易的軟體。
這個建構的過程並不簡單,因為從零學起,從排斥到接納,雖然是半強迫式的學習,但也消弭了對程式設計的恐懼感。從程式設計中,孩子們除了培養靈活的邏輯設計觀念之外,更從中體驗到:原來開發一個程式軟體,竟是相當不簡單!
一個手機遊戲軟體,人人取得容易。然而一個軟體的生命週期,從玩家對於軟體的精緻程度,將決定喜好的程度。 因此,在建構一個軟體的過程,不斷修飾程式的外觀之外,對於程式的內涵(程式碼)的功能強度,更是考驗一個程式設計者的智慧。
我們從課程中,最後希望帶給孩子們的是:認真看待智慧財產權。在一個產品開發的階段,是如此耗費工夫(時間)的,為了讓產品能永續成長,智慧財產是不容許被侵害的,因為從設計的過程中,既然如此辛苦,就更能體會其他開發產品的原設計者,當時對這個商品的努力程度。
2014年12月12日 星期五
利用matlab,一秒鐘讀取一筆資料
程式碼:
clear all
clc
data=[100 90 80 60 80 90 75 70 80 100];
n=size(data,2);
sum=0;
average_value=0;
for i=1 :10
if i==1
max_value=data(i);
min_value=data(i);
end
sum=sum + data(i);
if data(i)>max_value
max_value= data(i);
end
if data(i)
end
fprintf('第%d筆資料=%d,讀取完畢\n',i,data(i))
pause(1);
end
fprintf('-------------\n')
average_value=sum/n;
fprintf('平均值=%3.2f\n',average_value)
fprintf('最大值=%d\n',max_value)
fprintf('最大值=%d\n',min_value)
2013年4月14日 星期日
UltraSonicSensor應用-保護眼睛的守護神
NXT ,保護眼睛的守護神!
當超音波偵測到前方人體離電視太近的時候,系統發出Light光 線及聲音警告。
[機構]
[程式]
#define sonic_sensor IN_1
#define touch_sensor IN_2
#define light_sensor IN_3
#define touch SENSOR_2
#define MotorOut OUT_B
#define length 150
long tick;
void WaitSEC3()
{
tick=CurrentTick();
while(CurrentTick()<(tick+3000))
{
PlayTone(880,50);
Wait(950);
}
Wait(1000);
}
task main()
{
SetSensorTouch(touch_sensor);
ResetTachoCount(MotorOut);
SetVolume(4);
SetSensorLight(light_sensor,false);
SetSensorLowspeed(sonic_sensor);
WaitSEC3();
}
task MotorRotateFn()
{
Follows(main);
while(touch==0)
{
RotateMotorPID(MotorOut,10,90,40,40,90); //右轉
Wait(100);
RotateMotorPID(MotorOut,10,-170,40,40,90); //左轉
Wait(100);
RotateMotorPID(MotorOut,10,80,40,40,90); //右轉
}
Off(MotorOut);
StopAllTasks();
}
task DetectFn()
{
Follows(main);
while(true)
{
if(SensorUS(sonic_sensor) <length{
PlayTone(500,50);
SetSensorLight(light_sensor,true);
Wait(50);
SetSensorLight(light_sensor,false);
Wait(50);
}
}
}
PlayTone(500,50);
SetSensorLight(light_sensor,true);
Wait(50);
SetSensorLight(light_sensor,false);
Wait(50);
}
}
}