買書捐殘盟

2021年7月16日 星期五

多工執行緒的 Arduino 控制

 多工執行緒的 Arduino 控制

本範例在同一個時間內,同時做不同的任務(讓 led明滅、七段顯示器數字顯示),這是 圖控程式離線下所做不到的事。

 用圖控程式,它只有提供delay()函數,delay是讓工作暫時停止,必須等他做完才能執行下一個步驟。

是一種很標準的程序控制。
範例中,利用兩LED皆在Arduino的PIN-2,3,透過millis()的時間函數,分別對兩個LED提供不同的變化週期。



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日 星期六

小木屋+荷蘭風車

利用閒暇的時間,自己用Google Sketchup軟體繪製小木屋和風車的設計圖,並使用雷射切割機將零件切出。
在課程設計上,可在生活科技九年級能源與動力、電與控制等單元做應用





2014年12月13日 星期六

從AppInventor2開發產品中,體驗智慧財產的重要

學校自這個學期開始授課App Inventor課程之後,學生普遍的反應還算不錯。
過去國三的電腦課程,通常是上Visual Baic,但對於初次接觸程式設計的孩子來說,一堆抽象的文字語言,數字與字串,或者是運算子,甚至是迴圈的應用,條件式的判斷....光是這些就足以讓孩子們失去學習的信心。

這個學期開始之前,鄭博全老師找我一起商討對於國三學生的課程時談到AppInventor課程,打算在學期中授課,當下我對於這一套軟體並不陌生,因為過去在設計機器人nxt設計時,在進行藍芽連線時,就已經開始使用App Inventor這個軟體作為手機與機器之間的溝通橋樑。

在開始授課的時候,孩子們開始學習圖形化程式設計的操作,崁入式的程式碼建構,相較於傳統的文字程式來說,是淺顯而易懂的。雖然在剛開始還是會排斥著,然而在經過一段時間的學習後,孩子們慢慢地能夠習慣操作,並能慢慢地能夠自己產生一個簡易的軟體。

這個建構的過程並不簡單,因為從零學起,從排斥到接納,雖然是半強迫式的學習,但也消弭了對程式設計的恐懼感。從程式設計中,孩子們除了培養靈活的邏輯設計觀念之外,更從中體驗到:原來開發一個程式軟體,竟是相當不簡單!

一個手機遊戲軟體,人人取得容易。然而一個軟體的生命週期,從玩家對於軟體的精緻程度,將決定喜好的程度。 因此,在建構一個軟體的過程,不斷修飾程式的外觀之外,對於程式的內涵(程式碼)的功能強度,更是考驗一個程式設計者的智慧。

我們從課程中,最後希望帶給孩子們的是:認真看待智慧財產權。在一個產品開發的階段,是如此耗費工夫(時間)的,為了讓產品能永續成長,智慧財產是不容許被侵害的,因為從設計的過程中,既然如此辛苦,就更能體會其他開發產品的原設計者,當時對這個商品的努力程度。

2014年12月12日 星期五

利用matlab,一秒鐘讀取一筆資料

影片結果:https://www.youtube.com/watch?v=JZhv-OIad-8&feature=youtu.be

程式碼:
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)  min_value=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);
     }
   }
}
[影片]