113/10/14
課程內容:
1、Tinkercad
畫圖要注意單位
滑鼠的左鍵調整方塊大小、右鍵可以讓旋轉方塊、中鍵的滾輪可以平移方塊、圓錐點調整方塊的高度。
條紋方塊的功能是挖洞,與方塊疊在一起按group(上面第一個圖示) (形成群組)。
對齊同時選區兩個以上物件按(上面第三個圖示) 按圓圈圈去對齊上下左右,選兩個以上方塊以某方塊對齊按(上面第三個圖示),選定其中一個方塊按圓圈圈。
2、搜尋thingiverse可以找到他人的作品
3、3D列印機(層積式)
熱頭180度~200度/熱床60度~70度
1、校正(一張白紙)輕輕拉的出來、推不進去(注意不可以太緊)
2、小螢幕1234都要矯正
3、切層(額外的軟體Snapmaker Luban)
4、Export-選STL檔案
5、到軟體點3D打印(支撐(因為可能有鏤空))生成G代碼
6、存到USB,USB插到3D列印機
設計內容:
紫色方塊為學習如何使用條紋方塊去挖洞,中中的雪人是自行學習如何建構模型,右邊的米奇雪人是學習利用網路去抓取他人的設計。
這次的課程教會我們要如何使用繪圖軟體及3D列印機如何使用,在之後的實驗課程中是很重要的一個環節,在未來若有從事相關產業,也是一個很基礎的培養。
心得:
這次的課程其實沒有到很困難,電腦的設備,跟設計圖形很有關係,不過也可能是因為我自己不熟悉如何使用,助教也有提到最好有自己的電腦及滑鼠,滑鼠真的很重要,沒有會有很多困難,一開始我是使用平板電腦去作圖,真的做的很慢,後來用實驗室的電腦好用多了。在矯正3D列印機的時候要很注意是不是太緊,一開始我們調整的太緊,在最後會直接印不太出來,後來才知道原來輕輕的拉,要很輕很輕。只是我很不明白我的圖形是一體成形的,沒有凸那邊凹這邊,為什麼一定要到額外的軟體去做切層才能去列印。不過很可惜沒有將成果作品列印成果。
113/10/21
課程內容
1、麵包板
1、直行是聯通的
2、LED長腳接正極、短腳交GND
2、Arduino構造
1、ANALOG(類比訊號),例如亮度(不是0跟1)
2、DIGITAL(數位訊號)是非連續訊號,例如開關(只有0跟1)
3、程式碼分三個區塊
1、定義、變數與函數庫
放想要定義的東西、設定的變數或是要匯入的函式庫。
變數:資料(數字、文字)利用文字命名
函數庫:提供後面的程式碼做使用
2、啟動程式
3、主程式(一直重複執行)
4、pinMode(腳位,模式)
1、2~13
2、INPUT(輸入腳位)
3、OUTPUT(輸出腳位)
4、INPUT_PULLUP(輸入腳位使用上拉電阻)可以去除雜訊
5、註解(可有可無)
1、開頭/*結尾*/(看得懂 程式執行時不會執行)
2、//只執行那一行
6、Arduino
1、工具➡️開發板(Arduino Uno)➡️序列埠
設計內容:
練習1:
點亮兩個LED燈泡並且讓兩個燈泡輪流閃爍,控制閃爍的頻率在2秒一次。
const int ledPin1 = 13; // 第一個LED連接到腳位13
const int ledPin2 = 12; // 第二個LED連接到腳位12
void setup() {
// 設定腳位為輸出
pinMode (ledPin1, OUTPUT) ; //設定腳位功能
pinMode (ledPin2, OUTPUT);
}
//一直做某件事
void loop() {
// 打開第一個LED,關閉第二個LED
digitalWrite (ledPin1, HIGH); //執行腳位的高低點位輸出狀態
digitalWrite (ledPin2, LOW);
delay (2000);// 等待2秒
//打開第二個LED,關閉第一個LED
digitalWrite (ledPin1, LOW);
digitalWrite (ledPin2, HIGH);
delay (2000); // 等待2秒
}
學習使用麵包板與Arduino的組裝及程式碼如何運轉,學習修改錯誤的程式碼及註解的使用。雖然註解是可有可無的但是對於新手的我們寫出來可以讓我們更清楚那一行程式做了什麼事情,讓燈泡會如何運轉。
心得:
在練習一的撰寫程式上,最後還是利用了網路去搜尋,對於程式碼不熟的我,可能只能大概知道LED燈在程式碼中需要接到什麼腳位及杜邦線要與短腳或是長腳在同一行,沒有辦法在當下直接寫出程式碼的所有樣貌,但是經過查詢且看過一次程式碼的註解後,會很清楚這些程式碼如何運行的。
113/11/11
課程內容:
1、按鈕
1、Serial.begin(鮑率):告訴arduino要以多少鮑率傳送訊號。
2、digitalRead(腳位):讀取arduino該腳位獲得的訊號。
3、Serial.println(內容):在序列埠監控視窗顯示出想顯示的。
4、if(條件){程式碼}/else if(可以附加條件)/else(不可以附加條件)
設計內容:
練習1:
int buttonState = 0;
void setup()
{
pinMode(13, OUTPUT); // 13pin是Arduino內建LED的顯示角位
pinMode(7, INPUT_PULLUP); // 設定7pin是讀取訊號的位置
}
void loop()
{
buttonState = digitalRead(7);
if (buttonState == HIGH)
{
digitalWrite(13, LOW);
}
else
{
digitalWrite(13, HIGH);
}
}
網頁上的程式碼有偷偷暗藏玄機,LOW時燈是不會亮的。而HIGH時燈會亮。
心得:
這次網頁上程式碼偷偷藏了錯誤,導致直接複製程式碼的我,一開始做出來的成果與助教要求的不一樣,一開始燈泡也是自己忽亮忽暗的,但是只要在輸入端加上「上拉電阻PULLUP」就會形成穩定的燈泡。
113/11/18
課程內容:
1、函式庫
1、英文版中的函數庫稱為Library
2、各個元件與Arduino連結的模組
3、從Arduino本身來下載函式庫
a、首先先打開Arduino IDE -> 草稿碼 -> 匯入程式庫 -> 管理程式庫
4、ZIP函式庫匯入
a、在GitHub上搜尋,在網頁上打arduino libraryname(函數庫名稱) github
b、步驟:
1. 點擊Code -> Download ZIP下載zip檔
2. 打開Arduino IDE -> 草稿碼
-> 匯入程式庫 -> 加入ZIP程式庫...
3.找到下載下來檔案
4.點選檔案
2、Arduino時鐘
1、下載DS1302(函數庫)跟TM1637(GitHub)這兩個函數
設計內容:
練習一:
#include <Wire.h>
#include <ThreeWire.h>
#include <RtcDS1302.h>
ThreeWire myWire(A3, A4, A5); //接腳: DAT/IO, SCLK/CLK, RST/CE (DS1302的接線自行更改)
RtcDS1302<ThreeWire> Rtc(myWire);
void setup ()
{
Serial.begin(9600);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
//__DATE__,__TIME__,是程式碼編譯時的日期和時間
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
//判斷DS1302是否接好
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) first time you ran and the device wasn't running yet
// 2) the battery on the device is low or even missing
Serial.println("RTC lost confidence in the DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC was write protected, enabling writing now");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
//判斷DS1302上紀綠的時間和編譯時的時間,哪個比較新
//如果編譯時間比較新,就進行設定,把DS1302上的時間改成新的時間
//now:DS1302上紀綠的時間,compiled:編譯時的時間
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
//編譯時間比較新,把DS1302上的時間改成編譯的時間
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
}
void loop ()
{
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
Serial.println();
//判斷DS1302是否正常,如果不正常,一般是線沒接好,或是電池沒電了
if (!now.IsValid())
{
Serial.println("RTC lost confidence in the DateTime!");
}
delay(10000); // 10秒更新一次
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
//顯示完整年月日時間的副程式
void printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
實驗結果會在序列埠視窗中跑出11/18/2024 09:42:08
練習二:
#include <TM1637Display.h>
#define countof(a) (sizeof(a) / sizeof(a[0]))
#define CLK 11
#define DIO 12
TM1637Display display(CLK, DIO);
ThreeWire myWire(7, 6, 5); //接腳: DAT/IO, SCLK/CLK, RST/CE (DS1302的接線自行更改)
RtcDS1302<ThreeWire> Rtc(myWire);
void setup()
{
Serial.begin(9600);//鮑率57600
display.setBrightness(7);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
// Common Causes:
// 1) 第一次使用但設備還沒跑好
// 2) 電池電量低
Serial.println("RTC lost confidence in the DateTime!");
Rtc.SetDateTime(compiled);
}
if (Rtc.GetIsWriteProtected())
{
Serial.println("RTC was write protected, enabling writing now");
Rtc.SetIsWriteProtected(false);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
//判斷DS1302上紀綠的時間和編譯時的時間,哪個比較新
//如果編譯時間比較新,就進行設定,把DS1302上的時間改成新的時間
//now:DS1302上紀綠的時間,compiled:編譯時的時間
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
}
void loop()
{
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);//呼叫副函數
Serial.println();
if (!now.IsValid())
{
// Common Causes:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println("RTC lost confidence in the DateTime!");
}
}
void printDateTime(const RtcDateTime &dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),//月
dt.Day(),//日
dt.Year(),//年
dt.Hour(),//小時
dt.Minute(),//分鐘
dt.Second());//秒
Serial.println(dt.Minute());
display.showNumberDecEx(dt.Hour(), 0b11100000, 2, 2); //前兩位數設定為小時
display.showNumberDecEx(dt.Minute(), 0b11100000, true, 2, 2); //後兩位數設定為分鐘
delay(1000);
}
在顯示板上顯示現在時間
心得:這次的實驗很簡單,接線也不難,但是不知道為什麼序列埠所顯示出來的時間是錯誤的,一開始是正常的,然後就越來越快,換了好幾個板子,不是活在未來就是時間爆衝,助教幫忙測試,正常了,板子回到我的電腦上,還是有這個問題,我不知道是板子的問題還是電腦的問題,不過留到最後,在助教的幫助下,問題有解決了也很快的完成了第二個實驗。
113/11/25
課程內容:
1、用伺服馬達跟光敏電阻破解小恐龍
2、光敏電阻:
1、光線越強,電阻越小;光線越弱,電阻越大。
設計內容:
當仙人掌出現時,光線會變弱,電阻值會變小,使得馬達轉動,按下空白鍵,促使小恐龍跳起來;而當光線亮時,馬達不會轉動。
程式碼:
#include <Servo.h> //載入函式庫,這是內建的,不用安裝
Servo myservo; // 建立SERVO物件
int r = A0 ; //假設一個字母R代替A0的孔洞
int sensorValue;
void setup() {
Serial.begin(9600);
myservo.attach(9); // 設定要將伺服馬達接到哪一個PIN腳
myservo.write(0); //歸零
// put your setup code here, to run once:
}
void loop() {
sensorValue = analogRead(r);
Serial.println(sensorValue);
if(sensorValue <= 200){ //如果光敏電阻的數值小於或大於某一數值時,則伺服馬達轉動。
myservo.write(30); //旋轉到30度
delay(50); //延遲0.5秒
myservo.write(0); //旋轉到0度
delay(50); //延遲0.5秒 可自行更改
}
}
如果要將其變成夜晚模式,則要改變光敏電阻的數值,改到很正很正。
心得:
這次的課程很好玩,只是要注意光敏電阻的數值,要依據自己的序列服去更改,我們最後改到了200,也縮短了延遲的時間,最後才完成這個測試。在進行的過程中要自己調整光敏電阻在小恐龍前的位置,不可以太靠前,也不可以太靠後,還有馬達轉動時,要怎麼讓那個翅膀按到空白鍵,在沒有轉動時不可以按到空白鍵,我們後來調整了很久,才成功的讓小恐龍持續的跳跳跳。
113/12/02
課程內容:
1、DHT溫濕度模組
1、是一種數位式的溫度濕度感測器。
2、量測濕度:感濕元件吸收或釋放濕氣,讓感測電容值變化。
3、測量溫度:熱敏電阻測量環境溫度。
4、內建控制器將濕度和溫度值轉換成數位訊號輸出。
5、DHT11函式庫要安裝
2、倒車雷達模擬
1、超聲波感測器
a.偵測或計算遠端物件的距離。
b.發射器會發射高頻聲波的短突波,啁啾,涵蓋23-40kHz的頻率。
c.當聲音脈衝撞擊物體時,部分聲波會反射回到接收器。
d.有效感測距離為2-200cm。
3、蜂鳴器
1、產生聲音的信號裝置。
2、分兩種:
a.有源蜂鳴器(僅發出單一頻率的聲音)
b.無源蜂鳴器(可依不同頻發出不同聲音)
設計內容:
1、DHT11
//使用DHT11函式庫
#include <SimpleDHT.h>
//定義腳位自行更改
int pinDHT11 = 2;
//建立DHT11函式庫物件
SimpleDHT11 dht11;
void setup() {
Serial.begin(9600);
}
void loop() {
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
// start working...
Serial.println("=================================");
if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
return;
}
Serial.print("Humidity = ");
Serial.print((int)humidity);
Serial.print("% , ");
Serial.print("Temperature = ");
Serial.print((int)temperature);
Serial.println("C ");
delay(1000); //每1秒顯示一次
}
2、利用蜂鳴器、超聲波感測器、LED燈,做出類似倒車雷達的裝置。
#define m1 294 //頻率1
#define m5 440 //頻率2
#define h5 880 //頻率3
int red = 2;
int yellow = 3;
int green = 4;
int v=5; //蜂鳴器輸出
int trigPin = 12; //定義 觸發輸出腳位 Trig Pin
int echoPin = 11; //定義 回音接收腳位 Echo Pin
float duration, distance; //定義 時間長度duration 與 距離distance 格式為 浮點數
void setup(){
Serial.begin(9600); //設定 序列埠 鮑率
while (!Serial){ ;} //等待序列埠接通
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(v, OUTPUT);
pinMode(trigPin, OUTPUT); //設定 觸發輸出腳位(trigPin)的功能為 輸出(OUTPUT)
pinMode(echoPin, INPUT); //設定 回音接收腳位(echoPin)的功能為 輸入(INPUT)
}
void loop(){
//於 觸發輸出腳位 Trig Pin 產生觸發脈衝(應大於 10微秒)
digitalWrite(trigPin, LOW); // 讓觸發腳位trigPin 確實降回低電位,持續 20微秒 (us)
delayMicroseconds(20);
digitalWrite(trigPin, HIGH); // 觸發腳位trigPin 變成高電位,持續 20微秒 (us)
delayMicroseconds(20);
digitalWrite(trigPin, LOW); // 觸發腳位trigPin 再降回低電位,完成脈衝,使HC-SR04產生聲音脈衝出去
duration = pulseIn(echoPin, HIGH); // 於回音接收腳位(Echo Pin) 收到高電位(High) 的時間 (微秒 us)
distance = duration*0.0170; // 將聲音 "來回" 時間(us) 換算成距離 (cm) [ 假設聲波速率為 340 m/s ]
if (distance >= 25 ){
digitalWrite(green, HIGH);
digitalWrite(yellow, LOW); digitalWrite(red, LOW);
tone(v, m1, 200);
delay(250);
}
else if (distance >= 10 and distance <= 25){
digitalWrite(yellow, HIGH);
digitalWrite(green, LOW); digitalWrite(red, LOW);
tone(v, m5, 150);
delay(200);
}
else {
digitalWrite(red, HIGH);
digitalWrite(green, LOW); digitalWrite(yellow, LOW);
tone(v, h5, 100);
delay(150);
}
//Serial.println(distance); // 將 距離distance 傳送到序列埠暫存器
Serial.flush(); // 等待序列埠暫存器中的數據傳送至電腦完畢
delayMicroseconds(duration*1.5); //避免收到更早發出的聲音脈衝 回音
}
心得:
今天接線一直接錯,把線接到Arduino上的時候一直接錯地方,一直看錯。在沒有電路圖的時候,我會接不太出來,我發現我對於燈泡跟電阻的接線還是沒有很清楚,可能需要更多的練習,練習如何自己看著程式碼接線。