• 沒有找到結果。

登月小車7697 bit說明

N/A
N/A
Protected

Academic year: 2021

Share "登月小車7697 bit說明"

Copied!
12
0
0

加載中.... (立即查看全文)

全文

(1)

登月小車 7697 bit 使用免安裝,直接執行 BlocklyDuino3\

BlocklyDuino.exe

範例程式在 example 資料夾,按下右上角資料夾圖案(

),找到

想要開啟的範例程式即可打開。範例程式名稱對應的功能如下:

1.

AB_button - A 按鈕與 B 按鈕的使用

2.

array_char

燒錄 終端機 內建 Arduino IDE 開啟舊檔 儲存 bool a_button() { if (digitalRead(0) == 1) { return false; } else { return true; } } bool b_button() { if (digitalRead(7) == 1) { return false; } else { return true; } } bool c_button() {

if (digitalRead(0) == 0 && digitalRead(7) == 0) { return true; } else { return false; } } void setup() { Serial.begin(9600); pinMode(7, INPUT_PULLUP); } void loop() { if (c_button()) { Serial.println("AB"); } else if (a_button()) { Serial.println("A"); } else if (b_button()) { Serial.println("B"); } else { } } 與按鈕 B 共用(擇一)

8

(2)

3.

array_int

4.

Avoidance 超音波距離感測器避障

5.

color_sensor1 顏色感測器讀取 RGB 顏色通道

#include <Ultrasonic.h> Ultrasonic ultrasonic_(2, 5); void setup() { pinMode(17, OUTPUT); pinMode(12, OUTPUT); pinMode(16, OUTPUT); pinMode(13, OUTPUT); } void loop() { if (ultrasonic_.convert(ultrasonic_.timing(), Ultrasonic::CM) > 12) { analogWrite(17, 150); analogWrite(12, 0); analogWrite(16, 150); analogWrite(13, 0); } else { analogWrite(17, 0); analogWrite(12, 150); analogWrite(16, 150); analogWrite(13, 0); } }

8

(3)

6.

color_sensor2 顏色感測器紀錄顏色與比對

7.

face_OLED 顯示表情(共 9 種)

8.

IR_read - 紅外線遙控器訊號讀取(※不可和全彩 LED 共用)

(4)

9.

IR_send - 紅外線訊號發送

10.

line_follower 循線(黑色線)範例

11.

LinkIt_Remote - 手機 APP LinkIt Remote 遙控(利用藍芽)

int tracker() {

if (digitalRead(10) == 1 && digitalRead(11) == 1) { return 0;

} else if (digitalRead(10) == 0 && digitalRead(11) == 1) { return 1;

} else if (digitalRead(10) == 1 && digitalRead(11) == 0){ return 2;

} else { return 3; } }

void motor_LR(int ML, int MR) { if (ML > 0) { analogWrite(17, ML); analogWrite(12, 0); }else { analogWrite(17, 0); analogWrite(12, ML*(-1)); } if (MR > 0) { analogWrite(16, MR); analogWrite(13, 0); }else { analogWrite(16, 0); analogWrite(13, MR*(-1)); } } void setup() { pinMode(10, INPUT); pinMode(11, INPUT); pinMode(17, OUTPUT); pinMode(12, OUTPUT); pinMode(16, OUTPUT); pinMode(13, OUTPUT); } void loop() { if (tracker() == 0) { motor_LR(200, 200); } else if (tracker() == 1) { motor_LR(0, 200); } else if (tracker() == 2) { motor_LR(200, 0); } else { } }

void setup()

{

pinMode(17, OUTPUT);

pinMode(12, OUTPUT);

pinMode(16, OUTPUT);

pinMode(13, OUTPUT);

}

void loop()

{

analogWrite(17, 200);

analogWrite(12, 0);

analogWrite(16, 200);

analogWrite(13, 0);

delay(1000);

analogWrite(17, 0);

analogWrite(12, 200);

analogWrite(16, 0);

analogWrite(13, 200);

delay(1000);

analogWrite(17, 0);

analogWrite(12, 200);

analogWrite(16, 200);

analogWrite(13, 0);

delay(1000);

analogWrite(17, 200);

analogWrite(12, 0);

analogWrite(16, 0);

analogWrite(13, 200);

delay(1000);

analogWrite(17, 0);

analogWrite(12, 0);

analogWrite(16, 0);

analogWrite(13, 0);

delay(1000);

8

(5)

12.

motor_control1 移動控制(方法 1)

(6)

13.

motor_control2 移動控制(方法 2)

14.

OLED 螢幕顯示文字

15.

RGB_LED 魔幻 LED 使用方式(※撥到 micro bit)

註:Buzzer 接 P14,但積木只有中度音,切換到 Arduino 也不能變更,所以技巧是自行開啟

Arduino

IDE,將內容複製貼上再修改 tone(14,

196

) 低音 G,範例按下 A 是前後轉彎,

按下

B 是避障,按下 AB 是循跡避障

,按鈕不是中斷,使用方式有別於 micro

void motor_LR(int ML, int MR)

{

if (ML > 0) {

analogWrite(17, ML);

analogWrite(12, 0);

}else {

analogWrite(17, 0);

analogWrite(12, ML*(-1));

}

if (MR > 0) {

analogWrite(16, MR);

analogWrite(13, 0);

}else {

analogWrite(16, 0);

analogWrite(13, MR*(-1));

}

}

void setup()

{

pinMode(17, OUTPUT);

pinMode(12, OUTPUT);

pinMode(16, OUTPUT);

pinMode(13, OUTPUT);

}

void loop()

{

motor_LR(200, 200);

delay(1000);

motor_LR((-200), (-200));

delay(1000);

motor_LR((-200), 200);

delay(1000);

motor_LR(200, (-200));

delay(1000);

motor_LR(0, 0);

delay(1000);

}

8

(7)

bit。

LinkIt 7697 開發板的 P14/15/16/P17 四根腳位為 ADC 腳位 (Analog to Digital Converter),可接收類比

(Aanlog) 輸入訊號.顯示數值為 0~4095, 電壓範圍為 0~2.5V,超出 2.5V 會輸入會維持在 4095,若輸入電壓

過高會造成開發板損壞,使用

3.3V 當作輸入電壓,短時間使用不會造成開發板傷害。

LinkIt 7697 bit 與登月小車腳位(切到 micro bit):

全彩 LED 接 P4、Buzzer 接 P14、循跡感測 P10+11、

按鈕 A 接 P0、按鈕 B 接 P7(並接內建 LED/補光燈)、左馬達接 P17+12、右馬達 P16+13、超音波 Trig

接 P2、超音波 Echo 接 P5、紅外線 Tx 接 P3、紅外線 Rx 接 P15、7697 的 USR 按鈕接 P6,OLED 與顏

色感測均為 I2C。

(8)

MCS 雲端控制 LED 開關:透過控制

MCS

(MediaTek Cloud Sandbox 聯發科技雲端沙盒) 的 "開關"控制通

道,來遠端操控 LinkIt 7697 開發板上內建的 USR LED 明暗。實作此案例時,必須先要先註冊一個免費

MCS 帳號,

https://mcs.mediatek.com/

,教學

https://docs.labs.mediatek.com/linkit-7697-blocklyduino/c01-mcs-led-12879996.html

(9)

法蘭斯自訂積木的應用

1.

超好用 LINE Notify 通知應用

(10)

2.

溫度感測 MLX90614/90615 自訂積木,利用右上 開啟終端機視窗,觀看量測溫度。

3.

在其他項目中增加程式撰寫常用的『註解』技巧。

Linkit7697_MoonCar.ino 請對照 \example\Avoidance 更新後的積木範例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include "Wire.h" #include "U8g2lib.h" #include <Adafruit_NeoPixel.h> #include <Ultrasonic.h> int fun; int i;

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); Adafruit_NeoPixel pixels = Adafruit_NeoPixel(8,4,NEO_GRB + NEO_KHZ800);

// 底下為內建 OLED 九種表情圖案程式碼

const unsigned char F1[] U8X8_PROGMEM= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00…0x00}; …

const unsigned char F9[] U8X8_PROGMEM= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00…0x00}; Ultrasonic ultrasonic_(2, 5);

int tracker() //循跡感測積木對應產生的函數副程式

{

(11)

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

if (digitalRead(10) == 1 && digitalRead(11) == 1) { return 0;

} else if (digitalRead(10) == 0 && digitalRead(11) == 1) { return 1;

} else if (digitalRead(10) == 1 && digitalRead(11) == 0){ return 2;

} else { return 3; } }

void motor_LR(int ML, int MR) //馬達控制積木對應產生的函數副程式

{ if (ML > 0) { analogWrite(17, ML); analogWrite(12, 0); }else { analogWrite(17, 0); analogWrite(12, ML*(-1)); } if (MR > 0) { analogWrite(16, MR); analogWrite(13, 0); }else { analogWrite(16, 0); analogWrite(13, MR*(-1)); } } void music() { //自訂全家音樂函數副程式 tone(14, 330); delay(500); tone(14, 262); delay(500); tone(14, 196); delay(500); tone(14, 262); delay(500); tone(14, 294); delay(500); tone(14, 392); delay(1000);

8

(12)

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 tone(14, 294); delay(500); tone(14, 330); delay(500); tone(14, 294); delay(500); tone(14, 196); delay(500); tone(14, 262); delay(1000); noTone(14); } void setup() //初始化積木裡面的程式 { u8g2.begin(); u8g2.setFont(u8g2_font_6x10_tf); u8g2.setFontRefHeightExtendedText(); u8g2.setDrawColor(1); u8g2.setFontPosTop(); u8g2.setFontDirection(0); pixels.begin(); pixels.setBrightness(30); fun = 0; music(); pinMode(0, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(17, OUTPUT); pinMode(12, OUTPUT); pinMode(16, OUTPUT); pinMode(13, OUTPUT); pinMode(10, INPUT); pinMode(11, INPUT); } void loop() //重複執行積木裡面的程式 {

if (digitalRead(0) == LOW && digitalRead(7) == LOW) { fun = 3;

} else if (digitalRead(0) == LOW) { fun = 1;

} else if (digitalRead(7) == LOW) {

(13)

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 fun = 2; } if (fun == 1) { //前進→後退→左轉→右轉展示功能 for (i = 0; i <= 7; i++) { pixels.setPixelColor(i,pixels.Color(51,51,255)); } pixels.show(); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F7); u8g2.sendBuffer(); analogWrite(17, 255); analogWrite(12, 0); analogWrite(16, 255); analogWrite(13, 0); delay(1000); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F3); u8g2.sendBuffer(); analogWrite(17, 0); analogWrite(12, 128); analogWrite(16, 0); analogWrite(13, 128); delay(1500); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F4); u8g2.sendBuffer(); analogWrite(17, 0); analogWrite(12, 255); analogWrite(16, 255); analogWrite(13, 0); delay(2000); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F6); u8g2.sendBuffer(); analogWrite(17, 255); analogWrite(12, 0); analogWrite(16, 0); analogWrite(13, 255); delay(2000); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F8); u8g2.sendBuffer();

8

(14)

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 analogWrite(17, 0); analogWrite(12, 0); analogWrite(16, 0); analogWrite(13, 0); fun = 0; } if (fun == 2) { //避障功能 u8g2.clearDisplay(); u8g2.firstPage(); do {

u8g2.drawStr(0, 0, String(String() + "Ultrasonic : ").c_str()); u8g2.sendBuffer();

u8g2.drawStr(0, 14, String(String() + ultrasonic_.convert(ultrasonic_.timing(), Ultrasonic::CM) + " cm").c_str()); u8g2.sendBuffer(); } while (u8g2.nextPage()); if (ultrasonic_.convert(ultrasonic_.timing(), Ultrasonic::CM) > 30) { for (i = 0; i <= 7; i++) { pixels.setPixelColor(i,pixels.Color(0,255,0)); } analogWrite(17, 150); analogWrite(12, 0); analogWrite(16, 150); analogWrite(13, 0); } else { for (i = 0; i <= 7; i++) { pixels.setPixelColor(i,pixels.Color(255,0,0)); } analogWrite(17, 0); analogWrite(12, 150); analogWrite(16, 150); analogWrite(13, 0); } pixels.show(); } if (fun == 3) { //循線+避障功能 for (i = 0; i <= 7; i++) { pixels.setPixelColor(i,pixels.Color(255,255,51)); } pixels.show(); u8g2.firstPage(); do {

u8g2.drawStr(0, 0, String("Line follower mode").c_str());

(15)

186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 u8g2.sendBuffer();

u8g2.drawStr(0, 14, String(String() + "Ultrasonic : ").c_str()); u8g2.sendBuffer();

u8g2.drawStr(0, 28, String(String() + ultrasonic_.convert(ultrasonic_.timing(), Ultrasonic::CM) + " cm").c_str()); u8g2.sendBuffer(); } while (u8g2.nextPage()); if (ultrasonic_.convert(ultrasonic_.timing(), Ultrasonic::CM) > 30) { //循線增加避障會增加判斷時間,車速要慢才不會超出邊界 if (tracker() == 0) { analogWrite(17, 55); //當超出邊界,代表車速要更慢才不會超出邊界 analogWrite(12, 0); analogWrite(16, 55); //當超出邊界,代表車速要更慢才不會超出邊界 analogWrite(13, 0); } else if (tracker() == 1) { motor_LR(0, 55); //當超出邊界,代表車速要更慢才不會超出邊界 } else if (tracker() == 2) { motor_LR(55, 0); //當超出邊界,代表車速要更慢才不會超出邊界 } else { analogWrite(17, 0); analogWrite(12, 0); analogWrite(16, 0); analogWrite(13, 0); } } else { analogWrite(17, 0); analogWrite(12, 0); analogWrite(16, 0); analogWrite(13, 0); } } if (fun == 0) { for (i = 0; i <= 7; i++) { pixels.setPixelColor(i, pixels.Color((random(255)),(random(255)),(random(255)))); } pixels.show(); u8g2.clearBuffer(); u8g2.drawXBMP(0, 0, 128, 64, F1); u8g2.sendBuffer(); analogWrite(17, 0); analogWrite(12, 0); analogWrite(16, 0); analogWrite(13, 0); }

8

(16)

228 }

泰山高中 電子科 陳致中

109/6/25

參考文獻

相關文件

(九) 車削偏心 能以四爪單動夾頭夾持工件,利 用量錶調整偏心,其公差能控制 在±0.04公厘以內。.2. 能依材料性質及所用

• 系統此時除了檢查您的檔案與資料夾權限正確與否,並且也 檢查您的SERVER PHP版本、是否安裝了GD LIB與GD的版

第一步:在 VMware 按下 Install VMwave Tools 按下之後系統就會開啟安裝畫面給

選取本地根資料夾Æ右 1Æ開新檔案Æ輸入檔案名稱( index.html),Enter 鍵Æ右 1Æ設成 首頁 Æ重複〝右 1〝 本地根資料夾〞 Æ開新檔案Æ輸入檔案名稱,Enter

校長、學校行政主戶及「統一登入系統」學校行政戶口可按右上方的「

課程開課月份及預計學生人數(表格1) 8月 – 7月(翌年) 於「統⼀登入系統」呈報更新的學⽣資料.

討論結束,整理腦圖。首先嘗試將資料歸類,然 後可以開始收窄範圍,定出文章中心,再按照重

五、前列資料請依以下第八項附圖所示依序疊放,用長尾夾夾好後,將報名表件放入報名