2016年6月30日 星期四

Scicore 多功能sensors

搞了好久,終於弄出個第一代,我覺得我脫了好幾層皮。這個機台是台大江老師設計的,有基本的Arduino和16x2 IIC LCD和麵包版。還有三個USB母頭,三個可變電阻和四個開關。
可變電阻和開關我還都沒用到。想達到的功能,是用藍牙告訴機器想要做的實驗,然後就在LCD和serial monitor上顯示相關的數據,可以取得來做實驗。



2016年6月28日 星期二

Tracker研習筆記

今天其實超級累的,到研習會場一直打瞌睡真是不好意思。不過總算是把tracker關於運動位置和時間關係的解析方式學會了。

另外也學會了用tracker分析光譜,印象中好像比imageJ分析光譜來的容易一些啊。

今天學到一個做光譜實驗的眉角,是用錄影的方式取得不同sample的光譜。意思是不用一直重複拿拍照工具起來按,這樣放回去位置跑掉,事後要分析超麻煩。

這樣的話,如果想辦法用科學積木+SciView做一個可以穩定放置手機、sample、光源、這些東西的裝置。先用紅綠藍雷射定位之後,再放sample下去看光譜,應該是不錯的。

楊老師很慷慨的把講義放在網路上了,以後複習就靠這個了。

2016年6月26日 星期日

用VR讓serial.monitor顯示不同的訊息

說是測電阻,其實是測電壓。VR左右兩隻腳接了5v和GND,然後把中間那隻腳,接到analog pin上。旋轉改變電阻的時候,就會讓電壓值改變。讓analog pin讀取數值。

再用這個數值當成一個條件式,用if來決定要顯示出什麼訊息。

以超音波模組為例code如下


#include <Ultrasonic.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     13

Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
int potPin = 5;   //設定腳位是A5
int va1 = 0;      //將va1 起始值設為 0
void setup()
  {
  Serial.begin(9600);
  }

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

  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  inMsec = ultrasonic.convert(microsec, Ultrasonic::IN);
  va1 = analogRead(potPin);                                           //  讓va1去讀A5的數值
  if (va1>500)                                                                   // 如果va1大於500就顯示某個訊息
  {
  Serial.print("MS: ");
  Serial.println(microsec);
  delay(1000);
  }
  if (va1<500)
  {
  Serial.print(cmMsec);
  Serial.println(" CM ");
  delay(1000);
  }
  }

Science Maker的SciCore

拿到SciCore已經很久了,一直都沒機會拿出來用。最近兩天下定決心要拿出來好好用一下。這個SciCore平台包括了一塊Arduino UNO R3,一個1602LCD IIC, 一塊麵包版,四個3pin開關,三個可變電阻和三個USB母頭。 阿簡這邊有介紹

最近幾天想辦法把溫度計、壓力計、超音波測距什麼sensor都給他裝上去,也順便想辦法驅動了LCD(結果函式卡住,卡關一天多)

2016年6月25日 星期六

Sensordrone測水壓

之前用sensordrone測過水壓,是用夾鏈袋把sensordrone包起來丟到水裡,希望可以給學生看到水壓直接的呈現。


測到的結果不錯,但是最後夾鏈袋略微浸水,sensordrone從此就秀斗了。今年和同學徵召了另外一顆sensordrone,可不能再這樣搞了。所以就用另外的方式處了壓力囉。


首先用大針筒把sensordrone放在裡面,連接橡皮管到左邊的30cm長玻璃管,玻璃管上面貼著一支30cm的尺。


把管子伸到水裡面,就可以讓水壓著空氣,sensordrone測到的氣壓就是水壓了。當把管子往下壓的時候,水會壓進管子裡面,如果可以把管內水面切齊0cm的地方,只要看管外水面切齊幾公分,就知道水深了。這時候可以用針筒調節管內水面,就會很方便讀深度訊息了。

測到的數據繪製成圖

三條線,分別是大水族箱的水壓,量筒的水壓,證明口徑大小不影響壓力,只有深度會影響。兩條線整個疊在一起啊。

斜率就是液體的密度,測到水的密度是0.9894g/cm2

把量筒水倒掉換成酒精,測到的斜率是0.7895g/cm2, 標準值是0.789,實在有夠準的啊。


這個裝置是蠻好用的,不過在原理上,就要花多一點點時間跟學生解說了。

MPX4115測壓力

一樣是學阿簡的唷,看這裡 http://a-chien.blogspot.tw/2016/06/blog-post_18.html

以下是我的筆記

MPX4115是壓力的sensor,在這邊買的 : 淘寶網,算是便宜簡單的壓力計,可以測到的範圍是15 to 115 kPa,高壓上限不算太高,低壓還蠻低的。解析度不算太高,還算可用就是了。

外型長這樣



六隻腳,從右邊往左邊看,最右邊是訊號,然後是GND, VCC。左邊的三隻腳沒作用,不管它。

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);

}