2016年6月24日 星期五

Arduino + LCD 1602 IIC

這一兩天為了 LCD 1602 IIC顯示不正常的問題,非常的困擾。基礎能力不夠要debug實在是一件辛苦的事情,還好有同事可以諮詢一下,最後算是解決了。順便把一些LCD相關的東西學了一下,在這邊做個筆記,以後一定會忘記的。



下載最新的函式之後,丟到arduino的library,前置作業就完成了。

接著在寫程式的時候,如果要驅動LCD,就要把 wire.h 和 LCD驅動的library叫出來。可以從「草稿碼/匯入程式庫」把new liquidcrystal這個函式加進來,或是直接在程式碼的最前面加入:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // 設定 LCD I2C 位址 

加入這兩行之後,就代表LCD被驅動了,接下來就是要告訴LCD要顯示什麼訊息出來

語法是:
lcd.clear(); <--把畫面清理掉
lcd.setCursor(0, 0); 把位置定位到最左上角的地方
lcd.print( xxx ); 把xxx顯示出來,如果是文字的話就加上" "
大概就這樣,如果還有需要更多指令的話,就另外查吧。



利用超音波測量距離和速度

從這邊抄來的,放這邊當作自己的筆記本: http://a-chien.blogspot.tw/2016/06/arduino.html

這可以利用超音波模組測距離,同時配合時間算出速度和加速度。要做到這件事情,測量的時間間隔就要短,所以會一下子跳出大量的數據。只要從serial monitor抓取數據,就可以進行運動學分析。

不過這時候把數據用LCD呈現就沒意義了。不過沒關係,我還是把數據丟給LCD,不過只丟距離的數據就好,LCD就單純測距囉。

阿簡這個設計,還可以利用藍芽模組收數據。利用HC-05, or 06。

接線方式

接線方式
超音波模組
VCC to arduino 5v
GND to arduino GND
Echo to Arduino pin 13
Trig to Arduino pin 12


藍牙模組
VCC to arduino 5v
GND to arduino GND
RXD to D1
TXD to D0

注意藍芽模組的包率要調到9600, 方法在這邊。


要怎麼用電腦收到藍芽的數據呢?

1.把arduino先弄好,包含超音波偵測、藍芽模組、code甚麼地都弄好
2.arduino打開,讓電腦連到HC-05
3.到電腦的裝置管理員,找到藍芽模組是哪一個COM
4.打開arduino, 選擇那個藍芽COM
5.打開serial monitor




修改後的程式碼如下

#include <Wire.h>  // Arduino IDE 內建
// LCD I2C Library,從這裡可以下載:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <LiquidCrystal_I2C.h>

// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // 設定 LCD I2C 位址


#define trigPin 12
#define echoPin 13
int x0=0;//一開始的位置
int v0=0;//初速
float temp=20.0;//溫度
float c=(331.5+0.6*temp)/10000;//單位是每微秒幾公分
float intervaltime=100;  //每幾毫秒測量一次
float duration, distance,velocity,acceleration;

void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.begin(16, 2);
}


void loop() {

digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);//超音波來回經過的時間,單位是微秒
distance = (duration/2) *c;//單位是公分
velocity=(distance-x0)/(intervaltime/1000);//每秒速度
acceleration=(velocity-v0)/(intervaltime/1000);//每秒加速度

x0 = distance;
v0=velocity;
Serial.print("E");
Serial.print(distance);
Serial.print(",");
Serial.print(velocity);
Serial.print(",");
Serial.println(acceleration);
lcd.clear();
lcd.print("D=");
lcd.print(distance);
lcd.print(" cm");
delay(intervaltime);

}



2016年5月11日 星期三

Elements 4D by DAQRI

這是一個app,網站在這邊 : http://elements4d.daqri.com  。這是利用虛擬實境的方式,透過元素符號的積木,顯現出模擬元素圖片的APP。這是昨天看到清大林秀豪老師分享這個APP,回家馬上忍不住試了!並且用了一些方式改裝一下。

在網站的下方,就可以下載這個APP可以辨認的圖案,依照圖案裁剪下來,黏起來就會變成一個紙骰子。不過因為我覺得黏合不易,加上紙材質太軟,容易毀損。所以我就決定用別的方式來製作。

材料和做完的東西都在下面這張圖裡

首先是積木。這個積木多年前我拿來做週期表積木,買了一大堆。這次又派上用場了!先拿八顆積木組合起來,變成一個大約是邊常比4公分小一點點的方塊。但是原本網站上附的方塊是5公分立方的,所以我縮印約78%,差不多剛好,然後把六面裁下來,拿口紅膠黏上去就行了。我原本六面分開裁分開黏,後來發現可以六面相連的切下來,一次貼上去。

總共有六顆可以用,共36種元素。其實也不少了!

實際使用的樣子像下面的影片



2016年3月10日 星期四

電解水裝置

之前用針筒和寶特瓶做了電解水裝置

可以將電解液配好之後,倒入寶特瓶內,接上電極電解觀看到氫氧氣的比例,也可以點火測試。算是蠻方便的,不過後來持續電解,發現正極的碳棒會溶掉。氧氣的比例也過小,加上製作過程,水密還是不太容易處理。

就決定再改版!

電解水的裝置大概是我做過最多版本的實驗裝置了吧。

先看最後,長這樣:兩根針筒,黏上鱷魚夾。可以分別夾在燒杯上,接上電源就可以電解。電解液在燒杯裡面配好,再夾上針筒把電解液吸起來,接上電源就可以電解。


製作方式如下:

1.準備針筒。我上次去品美買的一袋針筒快用完了,下次去品美得在買個幾包...



拿一條電線約16~20cm,去掉兩端被覆塑膠皮。拿一根小迴紋針,剪掉一小段。把電線其中一頭焊上去


把電線另外一頭放到針筒裡面,從尖端伸出來。讓迴紋針在針筒裡面,然後用活塞塞進去,把迴紋針壓扁~。如果小迴紋針沒有剪,會稍微有點擁擠,也是塞的下就是了。


然後就變成這樣囉



接著把電線的另外一端,焊上鱷魚夾


然後把鱷魚夾用熱融膠黏在針筒上。鱷魚夾可以稍微折彎一下,這樣夾到燒杯上的時候,針筒會比較直。



這樣就完成啦...其實還沒。這樣可以電解,可是速度很慢,因為電解液不太容易從針筒進出。所以針筒底部那邊要多戳幾個洞...


 把電解液加入燒杯中

加了一點指示劑,做顏色識別。把電解液吸上來,通常會有一些氣泡,快速把活塞往下推,來回幾次就可以把氣泡排除掉。


接著就接上電源電解囉。這是電解液調到接近中性,而且加了廣用指示劑,不過電解速度比較慢的版本




最後看起來變這樣



接下來這個影片,是電解速度比較快的版本。大約十多分鐘可以搜集到20ml的氫氣。


也可以觀察到清楚的氫氧體積比




兩個電極分開的好處是,如果一支壞掉了,只要換掉一支就好。另外,這些裝置的問題就是電極容易損壞,尤其是正極,其實很容易就氧化掉了。所以容易替換電極是很重要的。這部份我還沒想清楚。




2016年2月19日 星期五

吹風機

吹風機當然也可以是個教具,拆開來看,裡面有許多國中電學會牽涉到的觀念,可以用一個吹風機來演示。

 用這種紅色的最陽春的吹風機就可以了




2015年12月25日 星期五

Arduino 超音波測距應用在聲音單元

就是這東西



除了可以應用在運動學上之外,在「聲音」課程中,提到關於「聲納」等超音波的應用時,這就是一個可以實際上讓學生看到的應用。

理論上如果把這玩意兒塞進一根密閉的管子裡面的一端,想辦法改變裡面的氣體組成(例如灌二氧化碳進去)或是改變溫度(同時加一根溫度計給arduino就好)應該可以進行影響聲速因素的一些探究課程。

下面的code可以顯示距離發射接收的時間,如果固定距離改變介質,測量時間,就可以測量介質對聲音速度的影響


code

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// HCSR04Ultrasonic/examples/UltrasonicDemo/UltrasonicDemo.pde
#include <Ultrasonic.h>


#define TRIGGER_PIN  12
#define ECHO_PIN     13

Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.backlight();
}

void loop()
{
  float cmMsec, inMsec;
  long microsec = ultrasonic.timing();

  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); // 計算距離,單位: 公分
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); // 計算距離,單位: 英吋
  Serial.print("E");
  Serial.print("   t=");
  Serial.print(microsec);
  Serial.print("ms   ");
  Serial.print("distance=");
  Serial.print(cmMsec);
  Serial.println("cm");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0 ,0);
  lcd.print("t=");
  lcd.print(microsec);
  lcd.print("ms");
  lcd.setCursor(0, 1);
  lcd.print("D=");
  lcd.print(cmMsec);
  lcd.print("cm");
    delay(1000);
}

Arduino收集溫度數據並分析

用Arduino加上溫度計,進行熱與溫度的實驗,收集數據並分析。可以輕易的獲取大量的數據,長時間收集數據後,再把數據交給學生分析討論也沒問題。數據收集中的畫面,可以用PLX-daq即時收集起來,畫成圖。就是每蒐集一個點,excel的圖就會長出一個點這樣...