04智慧垃圾桶

(2017/01/08)

昨天在尋找PM2.5的資料時,發現有一篇文章是寫「智慧家庭」,其中有一個應用是國小學生很容易可以做到的,那就是「智慧垃圾桶」,也把此作品拿到今年冬令營來創作!所以今天就去大創找一下有沒有適合創作的垃圾桶,雖沒有很滿意,但還是找到一個比較合適的!

題目一:智慧垃圾桶(Transformer版)

  • 說明:此垃圾桶當人一靠近就會自動把蓋子掀開,若人沒離開,蓋子會一直開著,等人離開後蓋子才會蓋住
  • 所需材料:
    • Arduino控制板 X 1
    • 超音波距離感測器 HC-SR04 X 1
    • SG90 伺服馬達 X 1
    • 16孔的自由手臂 X 1
    • 18650電池盒 X 1 及18650電池 X 2 (註:9V電池電力不足) (離線工作用)
    • LED燈 X 1
    • 杜邦線 X
    • 垃圾桶 X 1
  • 硬體部分:
  • 啟動Transformer 2.0,並進入Scratch2.0
  • Scratch程式:(程式很簡單,所以才說適合國小學生來做)
  • 註:原本是寫下面的程式,SG90的活動角度是介於0度與90度,但發現程式執行久了之後(特別是離線版),啟動SG90到90度時,SG90不會動,會發出怪異的高頻嗡嗡聲音,本體發燙,出現嚴重問題!
  • 經上網查資料,發現:
    • 只讓SG90從30 跑到150 度,這是因為SERVO 裡面的定位是透過一顆VR 讀取數值來定位,若是讀者買過電子材料行的可變電阻就會知道,一般的可變電阻能轉的角度就是約120 度。各家SERVO 製造商對於這個角度設定是差很多的,有些甚至只有80 度(中點左右各40 度)而已,有些則可以高達360 度。若是超過許可的運動角度,有可能害SERVO 燒毀或是卡住,甚至可能因此害控制板燒毀
    • 第二個要注意的問題是delay(20); 這行,這有什麼好注意? 這跟SERVO 的特性有關,一般的便宜SERVO,標準的PWM 接受格式是50Hz/sec,也就是每個波長= 1秒/ 50 = 20ms 為每一個脈波的週期長度,所以一個改變位置的指令送出後,需要等待至少20ms再送會比較好,況且,SERVO 是有運動速度的,也得給他時間確實的移動到指令要求的時間,而不是拼命的送出移動指令,送太快並沒有意義,可能還會干擾SERVO 運作。
    • (不要再用此程式)
  • 所遇到的問題:一開始SG90 伺服馬達的位置是放在桶子後方,但發現蓋子好像太重,SG90無法將蓋子撐開,所以改到後來的位置!小朋友,知道這裡的物理原理嗎?
    • 答案:這與「力矩」有關,一開始的位置要將蓋子打開的力臂很短,所以就要出很大的力才能將蓋子打開,由於力道不足,所以蓋子就打不開!第二個位置因為力臂變很長,所以同樣的力量就可以把蓋子打開了!<< 力矩=力 X 力臂 >>
    • 測試成功!

題目一:智慧垃圾桶(MotoBlockly版,離線版)

  • 硬體的部分同上
  • 進入Moto Blockly (檔案於附件),剛好這兩個模組 HC-SR04 、SG90 伺服馬達 ,motoblockly也都有相關積木可用
    • Arduino 程式
      • #include <Servo.h>
      • int ultrasonic_trig = 10;
      • int ultrasonic_echo = A0;
      • float ultrasonic_distance() {
      • digitalWrite(ultrasonic_trig, LOW);
      • digitalWrite(ultrasonic_echo, LOW);
      • delayMicroseconds(5);
      • digitalWrite(ultrasonic_trig, HIGH);
      • delayMicroseconds(10);
      • digitalWrite(ultrasonic_trig, LOW);
      • unsigned long sonic_duration = pulseIn(ultrasonic_echo, HIGH);
      • float distance_cm = (sonic_duration / 2.0) / 29.1;
      • return distance_cm;
      • }
      • Servo servo_6;
      • void setup()
      • {
      • pinMode( ultrasonic_trig , OUTPUT);
      • pinMode( ultrasonic_echo , INPUT);
      • pinMode(13, OUTPUT);
      • servo_6.attach(6);
      • }
      • void loop()
      • {
      • if (ultrasonic_distance( ) <= 15) {
      • digitalWrite(13,HIGH);
      • servo_6.write(90);
      • delay(10000);
      • digitalWrite(13,LOW);
      • servo_6.write(0);
      • delay(1000);
      • }
      • }
  • 離線測試:發現用9V的電池電力好像不夠,改用兩顆18650來試試