2019年5月2日 星期四

LCD顯示


我買到的LCD顯示器有兩種,下圖上方是原始的,下圖下方是有加上轉換IC的,不同點在背面,

原始的LCD雖然接線很複雜,只要照著接就好,自己搞最久的是在相對簡單的加強版上

因為搞錯IC的型號,找到的函式庫都不對,測試了很久,終於找到了底下的連結可以使用
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/


另外,底下是原本的測試碼,用的是11,12,6,5,4,3這6個腳位,但是中間有跳過腳位,心理一直很介意
#include <LiquidCrystal.h>

LiquidCrystal lcd(11,12,6,5,4,3);

void setup() {
  // put your setup code here, to run once:
lcd.begin(16,2);
lcd.print("hello,world!");
}

void loop() {
  // put your main code here, to run repeatedly:
lcd.setCursor(0,1);
lcd.print(millis()/1000);
}

所以又尋找到一篇可以自訂腳位的方法,看到排線都在一邊,心裡就舒暢了點。
http://yhhuang1966.blogspot.com/2015/03/arduino_25.html

#include <LiquidCrystal.h>
#define RS 2
#define E 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7


LiquidCrystal lcd(RS,E,D4,D5,D6,D7);  //建立 LCD 物件


void setup() {  //初始設定 (一次性)
  lcd.begin(16,2);  //定義 LCD 為 2 列 16 行顯示器

  lcd.clear();  //清除螢幕
  lcd.setCursor(0,0);   //游標移到左上角
  lcd.print("Hello World!");   //在第一列印出 Hello World!
  }

void loop() {  //無限迴圈
  lcd.setCursor(0,1);  //游標移到第 2 列第 1 行
  lcd.print(millis()/1000);   //印出秒數
  }

接腳功能接 Arduino 
1 (VSS)電源負極GND
2 (VCC)電源正極5V
3 (Vo)調整對比可變電阻中腳
4 (RS)D0~D7放入資料暫存器 (1) 或指令資料暫存器 (0)腳位 2
5 (RW)讀取 (1) 或寫入 (0) LCDGND (寫入)
6 (E)可寫入 (1) 或不可寫入 (0) LCD腳位 3
7 (D0)資料位元 0不接
8 (D1)資料位元 1不接
9 (D2)資料位元 2不接
10 (D3)資料位元 3不接
11 (D4)資料位元 4腳位 4
12 (D5)資料位元 5腳位 5
13 (D6)資料位元 6腳位 6
14 (D7)資料位元 7腳位 7
15 (A+)背光電源正極5V
16 (-K)背光電源負極GND


再來看有轉換IC的


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  // put your setup code here, to run once:

lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.backlight();
lcd.print("hello,world!");
}

void loop() {
  // put your main code here, to run repeatedly:
lcd.setCursor(0,1);
lcd.print(millis()/1000);
}


溫濕度感測器DHT11



這是測試用的sensor,背面有印上規格,

     
底下聯結有詳細說明
http://playground.arduino.cc/Main/DHT11Lib

並且有建議的接線方式

因為arduino要去讀懂這個sensor的data,所以我們必須要把解讀sensor的資訊給arduino,也就是這個sensor的library,底下的聯結有提供製作的方法
http://playground.arduino.cc/Main/DHT11Lib
像底下這樣子的檔案架構


準備好之後,就可以開始撰寫程式了,但是,有一個觀念要先說明,那就是sensor偵測到的值要怎麼顯示出來呢?因為現在還沒有講到LCD,只能叫arduino送出來,送到哪裡呢?就是寫程式時在工具那邊有個"序列埠監控視窗"的選項,為什麼是序列埠呢?這牽涉arduino的設計,




#include <dht11.h>
dht11 DHT11;
const byte dataPin=2;

void setup() {
  Serial.begin(9600);
}

void loop() {
int chk=DHT11.read(dataPin);
if (chk==0) {
      Serial.print("Humidity  (%):  ");
      Serial.println((float)DHT11.humidity,2);
      Serial.print("Temperature  (.C):  ");
      Serial.println((float)DHT11.temperature,2);
            }
   else {
     Serial.println("Sensor Error");
   }
   delay (2000);
}



2019年2月17日 星期日

MPU-6050三軸加速度陀螺儀6DOF模組 GY-521


這個模組能夠輸出六個數據,三個軸的傾斜角度跟加速度,但是角度是偵測水平變化,而加速度則是偵測線性運動的變化,在還沒開始使用前,自己就感到很困惑,因為拿到這個模組時,很懷疑這麼小的東西要怎麼偵測這兩種數據,尤其是還有陀螺儀,印象中,陀螺儀不就是一個陀螺在轉嗎?

於是上網用"mems 陀螺儀"查看看,了解是利用科氏力(科裡奧利力(Coriolis))的原理,在微電機裡面也不是真的有個陀螺,詳細就不去研究了,先知道個大概之後,就來用看看吧。

然後,又遇到問題了,我根本不知道有什麼SCL,SDA之類的,查到了SDA (Serial Data line),SCL (Serial Clock Line),的說明,這是兩個裝置通訊所用的接腳,至於通訊用的協定則是採用I2C,因為這個模組用的通訊協定是I2C,所以就會使用這兩個接腳,我有查到接腳的說明,路徑如下
https://www.mschoeffler.de/2017/10/05/tutorial-how-to-use-the-gy-521-module-mpu-6050-breakout-board-with-the-arduino-uno/
好,那arduino上呢?

  • VCC (The breakout board has a voltage regulator. Therefore, you can connect the board to 3.3V and 5V sources.)
  • GND
  • SCL (Serial Clock Line of the I2C protocol.)
  • SDA (Serial Data Line of the I2C protocol.)
  • XDA (Auxiliary data => I2C master serial data for connecting the module to external sensors.)
  • XCL (Auxiliary clock => I2C master serial clock for connecting the module to external sensors.)
  • AD0 (If this pin is LOW, the I2C address of the board will be 0x68. Otherwise, if the pin is HIGH, the address will be 0x69.)
  • INT (Interrupt digital output)


因為我用的是arduino nano,就查了一下接腳,A5是SCL,A4則是SDA
網路上有很多文章,我是參考底下這篇
http://dory168.blogspot.com/p/gy-521sensormpu-6050dmp-ic.html

函式庫是底下路徑,要注意的是所需要的函式庫是放在Arduino目錄下
https://github.com/jrowberg/i2cdevlib

還有,文章中有提到驗證會出現錯誤,我抓的版本沒有,也許有修正錯誤了
因為有輸出數據,就不想去研究了

看到了數字,就想試試看圖像化的效果,
但是,在下載  “Toxi” 函式庫時遇到問題,因為這個連結過去的好像不是,就GOOGLE了一下,從網站首頁找下底下的網址
https://bitbucket.org/postspectacular/toxiclibs/downloads/

結果,安裝processing的時候又遇到了問題,出現警告訊息說有檔案遺失而無法安裝,於是試了幾個版本,最新版都不行,防毒都關了也沒用,只有2.2.1可以開啟,但是編譯的時候卻出現錯誤,看來是JVM的版本不合,抓了各種JVM都不行,就卡在這裡了。

而且發現,瞬間超過某個角度之後,MPU6050就會當掉,又再上網查了之後知道這是抓data時會頓停的問題,但是就必須要連arduino都要重開,所以又在找到下面的文章,使用他的程式碼後就好了。
http://microchip.eefocus.com/module/forum/thread-57814-1-1.html









2019年2月13日 星期三

Mini MP3 Player

為了想要用arduino控制音效,所以淘了這個撥放器回來試試看,一看到底下說明整個就傻住了,竟然要發送指令,這,我不會啊,幸好賣家提供了一篇文章









https://stonez56.blogspot.com/2015/03/arduino-dfplayer-mini-mp3-module.html

原始文章應該出自底下
https://t93093.wordpress.com/2017/08/03/arduino-%E6%B8%AC%E8%A9%A6-dfplayer-mini-mp3-%E6%92%AD%E6%94%BE%E6%A8%A1%E7%B5%84/

但是,看的時候不仔細,多花了點時間,所以依照自己的方式做紀錄,
先到底下路徑抓函式庫放到arduino的libraries
https://github.com/DFRobot/DFPlayer-Mini-mp3

#include <DFPlayer_Mini_Mp3.h>

聲音檔的放置方式:
在準備的micro SD卡裡面新增"mp3" 資料夾,把聲音檔放進這個資料夾
而聲音檔要先以四個數字命名0001~9999,在寫arduino程式碼的時候,要使用哪個聲音檔,不管前面的0,比如0001寫1就可以,
mp3_play (1);         //播放0001的聲音檔

測試用的程式碼,注意接腳用的是0、1,所以傳程式碼時先不要接
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

//
void setup () {
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (15);
}


//
void loop () {     
mp3_play (1);
        delay (6000);
}

聲音檔名的數字之後就可以加文字,比如0001test.mp3,

我也拆了一條USB線,測試讀卡功能,插到電腦上,還真的有抓到勒


只是,有個困惱的地方,接喇叭的正負極並沒有清楚的標示,實際上測試則是怎麼接都可以,但SPK2接正極的時候雜音比較少,至於要沒雜音的話,

依照官方的說法,需要接個1k的電阻,不過,上述的測試程式碼不能使用底下的接腳,因為是接10、11,所以為了符合底下的接腳說明,稍微修改了一下





#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX

void setup() {
 Serial.begin (9600);
 mySoftwareSerial.begin(9600);
 mp3_set_serial (mySoftwareSerial); //set Serial for DFPlayer-mini mp3 module
 mp3_set_volume (20);

}

void loop () {     
 mp3_play (1); //play 0001.mp3
 delay(10)
}




官方也有提供函式庫跟範例
http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0299)DFPlayer_Mini%E6%A8%A1%E5%9D%97

接著,我叫兒子錄了兩句話,把它接到otto上,只不過otto的10跟11是用來接嘴巴的Led,因為線太亂,我沒有接,修改成遇到障礙物發出人聲警告。

題外話,因為我本來是用mblock寫程式,但是不知道怎麼把MP3player加進去,所以想用arduino 的IDE來編輯程式碼,但是,不管怎麼compiler都失敗,後來,到下面下載函式庫放到libraries裡面就可以了。
https://github.com/stembotvn/OttoDIY_mBlock_Extension





2019年1月6日 星期日

Arduino的快速使用說明

市面上已經有太多書了,我自己買了不下五本,也看了很多網站,但每次要開始寫的時候又要重新看,所以在理解之後以自己的方式整理,重新再看的時候比較快進入狀況。

在連結Arduino之後,電腦有可能無法正確認識到,因為驅動程式不正確

有一個可能性是使用了CH340C的晶片,安裝正確的驅動程式安裝就可以指派一個COM
這個COM號碼就是要在編輯Arduino程式的時候使用的。

電腦可以認識Arduino之後,就要連接Arduino來使用了。
我們要去Arduino的網站下載軟體來安裝,
https://www.arduino.cc/

WIN10的話,要用APP的版本,才有反應
打開程式後,設定好開發版,處理器,序列埠



arduino的程式,是分成兩個區塊來設定
第一塊是對於arduino板子的設定,比如哪個接腳是輸入,哪個接腳是輸出
void setup() //初始化變數,設定接腳模式
{
}

第二個區塊是要執行的程式碼

void loop()
{
}

底下的例子是將接腳13設定成輸出訊號的模式,相對的,也會有輸入的模式,比如使用sensor來接收數據的時候。
第一區塊就是
void setup() {
pinMode(13, OUTPUT);
}

在上面設定好哪個接腳要做輸出之後,再來第二個是動作,比如要輸出開或關,延遲多久,
底下的例子是,開0.001秒之後,關1秒,再開1秒,再關0.001秒
所以,第二區塊就是
void loop() {
digitalWrite(13, HIGH);
delay(1);
digitalWrite(13, LOW);
delay(1000);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1);
}


上面是設定單一接腳的時候,如果要接一個以上,追加就可以,底下是個例子,不過
void setup() {
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
}

有幾個接腳須注意,13是接到內部的一個LED,所以上面的程式會讓板子上的LED亮,另外,有幾個接腳也跟內部相連,比如D0跟D1,是跟RX跟TX相連,這兩個接腳就不建議使用,A0至A5分別可視為D14至D19


更進一步,在設定板子之前,是可以先宣告變數跟各種條件
這種在設定需要控制多個接腳以及多種狀態時,非常好用

設定全域變數
const int led[ ]={3,9,10,11}; //宣告一個一維陣列,它是一個不能變動的常數,其型態是int,
int varNums; //宣告一個int型態的變數,用來指定有幾種模式
int ledNums; //宣告一個int型態的變數,用來指定各個模式下各led的亮度
const int brightness[7] [4] = //宣告一個二維陣列,有7列(模式),每一列有4個值(led的亮度),
{ {250,0,0,0}, //第一種模式
{100,250,0,0}, //第二種模式
{50,100,250,0}, //第三種模式
{5,50,100,250}, //第四種模式
{0,5,50,100}, //第五種模式
{0,0,5,50}, //第六種模式
{0,0,0,5}, //第七種模式
};


然後在要執行的程式碼裡面,加上這些模式


void loop()
{
 for (varNums=0; varNums<7; varNums++) //從第一種亮燈模式開始,在小於7次之前,每次加一
{
for (ledNums=0;ledNums<4;ledNums++) //從第一個接腳開始,在小於4次之前,每次加一
analogwrite(led[ledNums],brightness[varNums][ledNums]);
//將每個模式下的每個接腳的led狀態讀過一次並輸出
delay(100); //延遲0.1秒
}
}

也可以把另外寫好的函式庫功能給放進來,這些函式庫先寫在某個檔案裏面是,
副檔名是h,比如說****.h,然後在arduino的程式碼一開頭的地方,寫上#include <****.h>就可以了




2018年12月20日 星期四

Tone

為了讓OTTO發出不同的聲音,想要用無源蜂鳴器發出音樂
找到了將MIDI轉換成TONE程式碼的網站

先到底下網站抓midi檔
https://musescore.com/dashboard

然後到底下網站,將midi檔轉成arduino的tone函數用的程式碼
https://extramaster.net/tools/midiToArduino/

2018年12月19日 星期三

藍芽HC-05跟HC-06

會想使用藍芽,是因為要自己安裝OTTO,一開始買了《超圖解Arduino 互動設計入門》,但還是看不懂,還好作者有繼續補充,在參考底下說明之後,大概有了一些了解
https://swf.com.tw/?p=693

連線方式參考底下
https://swf.com.tw/?p=712


HC-06比較簡單,通電之後,只要不配對,就是AT MODE,

但是,HC-05就比較麻煩,要先讓KEY腳位通電之後,才可以送電給藍芽模組,所以有些已經焊好底板的模組,會拉一個按鈕在底板上,只要一直按著按鈕,再通電,然後放掉,就可以進入AT MODE去做設定了。

可是,外觀不知道怎麼判斷

注意,有些HC-06模組的AT指令輸入方式跟HC-05一樣,其實,在測試幾個模組之後,發現對岸的商品真的,嗯,變化多端,因為有的指令甚至是綜合兩種模式,有機會在一一列出來。

HC-05的接線跟Arduino的程式可以參考底下文章
https://www.instructables.com/id/Modify-The-HC-05-Bluetooth-Module-Defaults-Using-A/

接線方式
HC-05 GND --- Arduino GND Pin
HC-05 VCC (5V) --- Arduino 5V,  3.3V比較安全 
HC-05 TX --- Arduino Pin 10 (soft RX)
HC-05 RX --- Arduino Pin11 (soft TX)
HC-05 Key或EN (PIN 34) --- Arduino Pin 9

程式碼,底下所謂的"再接電"指的是手動,先不對藍芽通電,再手動接上去
#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);  // 先接電HC-05 pin 34 (key) ,再接電給藍芽模組
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}

void loop()
{

  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}

實際要連線時卻有遇到問題,可以從下圖看到一開始是失敗的,ERROR兩次之後才成功,找不到原因,而且幾乎每次都這樣。


輸入AT COMMAND,操作可以參考底下這一篇
https://home.gamer.com.tw/creationDetail.php?sn=3905171

底下的設定內容是以OTTO當例子
設定名稱:"AT+NAME=Zowi"
設定密碼:"AT+PSWD=1234"
設定速率:"AT+UART=115200,1,0"


在我買到的模組裡面,還有一種設定密碼的方法,AT+PIN1234:將連線密碼換為「1234」



底下是從購買模組的網站抓來的內容。

HC-05蓝牙转串口适配器模块组 CSR主从一体51单片机

            
产品介绍:
绝对原厂,支持主从一体,可用AT命令切换主从。
资料:http://pan.baidu.com/s/1nuOjQel
【产品系列命名规则介绍】:本公司蓝牙核心模块产品有:
HC-05是主从一体化的蓝牙串口模块,主从可指令切换,指令丰富齐全(供电电压 3.3V~3.6V)
HC-06是主从一体化的蓝牙串口模块,主从可指令切换,指令少于HC-05,使用简单。(供电电压 3.3V~3.6V)
主机:用来搜索从设备,不能被其他设备搜索。(带白点的蓝牙模块)
从机:用来被搜索的设备,不能主动搜索其他设备。
主从连上以后就相当于一根串口线使用,这个时候就不分主从,也就是透传模式。
【本模块可设置为主机或从机,主机能和从机配对通信,从机与从机之间或主机与主机之间不能通信,从机能和电脑、手机等的蓝牙配对通信,购买时默认为从机】
【注:HC-05主机可以和06从机互相配对】
1、 采用CSR主流蓝牙芯片,蓝牙V2.0协议标准。
2、模块供电电压:3.3V~3.6V。
3、 默认参数:波特率 9600、配对码 1234、工作模式 从机。
4、 核心模块尺寸大小为:27mm x 13 mm x 2mm。
5、 工作电流:配对中:30~40mA   配对完毕未通信:2~8Ma    通信中:8mA   无休眠。
6、 通讯距离:空旷条件下10M,正常使用环境  8M左右。
7、 用于GPS导航系统,水电煤气抄表系统,工业现场采控系统,可以与蓝牙笔记本电脑、电脑加蓝牙适配器、PDA等设备进行无缝连接。
8、可以对STC单片机无线升级和下载程序。
凡带有蓝牙功能的产品必须通过BQB认证,否则该产品就会被蓝牙技术联盟(BluetoothSpecialInterest Group, 简称SIG) 视为侵权。具有BQB认证的蓝牙产品更有利于出口到海外市场!不管是拿来研发或是代销都有质量保证!
 引  脚名称  说明
 1
     TX            模块串口发送脚(TTL电平,不能直接接RS232电平),可直接接单片机的RX
 2 RX 模块串口接收脚(TTL电平,不能直接接RS232电平),可直接接单片机的TX
 12 VCC 电源3.3V
 13 GND 地
 32 LED 配对状态输出显示
 34 KEY 用于进入AT状态,高电平有效(悬空默认为低电平)
模块进入AT指令有两种方法
1:在模块上电之前(也可以同时),把KEY脚设置为高电平(或接VCC),然后再对模块上电。此时LED慢闪(2S一次),模块进入AT状态,波特率固定为38400.
2:在模块上电的时候,把KEY脚设置为低电平(或接GND),此时LED快闪(1S两次),然后再把KEY脚设置为高电平(或接VCC),模块也会进入AT指令,但是LED依旧快闪,此时波特率为默认波特率9600.
电脑与单片机数据传输
下图中的USB-TTL参数架为广州汇承最新研发的参数架HC-USB-P,专门为HC蓝牙系列产品量身定做功能强大的参数架。客户可以用该参数架对模块进行更改参数和检测,大大方便了客户使用蓝牙模块过程中遇到的各种问题。
产品特性:
1、led引脚指示蓝牙连接状态,输出脉冲表示没有蓝牙连接,输出高表示蓝牙已连接并打开了端口
2、电源电压3.3V,未配对时电流约30mA,配对后约8mA,绝对禁止接反电源!电源绝对禁止超过4.2V!
3、接口电平3.3V,可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机最好串联一个1K电阻再与模块直接连接,无需MAX232也不能经过MAX232!
4、空旷地有效距离10米,超过10米也是可能的,但不对此距离的连接质量做保证
5、配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。
6、在未建立蓝牙连接时支持通过AT指令设置波特率、名称、配对密码,设置的参数掉电保存。蓝牙连接以后自动切换到透传模式
7、体积小巧(2.7cm*1.3cm),工厂贴片生产,保证贴片质量。
8、该链接为从机,从机能与各种带蓝牙功能的电脑、蓝牙主机、大部分带蓝牙的手机、PDA、PSP等智能终端配对,从机之间不能配对
AT指令集
HC-05嵌入式蓝牙串口通讯模块(以下简称模块)具有两种工作模式:命令响应工作模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;当模块处于命令响应工作模式时能执行下述所有AT命令,用户可向模块发送各种    AT  指令,为模块设定控制参数或发布控制命令。通过控制模块外部引脚(PIO11)输入电平,可以实现模块工作状态的动态转换。
串口模块用到的引脚定义:
1、PIO8连接LED,指示模块工作状态,模块上电后闪烁,不同的状态闪烁间隔不同。
2、PIO9连接LED,指示模块连接成功,蓝牙串口匹配连接成功后,LED长亮。
3、PIO11模块状态切换脚,高电平-->AT命令响应工作状态,低电平或悬空-->蓝牙常规工作状态。
4、模块上已带有复位电路,重新上电即完成复位。
设置为主模块的步骤:
1、PIO11一直置高,然后对模块上电。
2、上电以后,模块进入AT命令响应状态。
3、超级终端或其他串口工具,设置波特率38400,数据位8位,停止位1位,无校验位,无流控制。
4、串口发送字符“AT+ROLE=1\r\n”,成功返回“OK\r\n”,其中\r\n为回车换行。
5、PIO置低,重新上电,模块为主模块,自动搜索从模块,建立连接。


藍芽CC2541


低待机功耗 90uA~400uA
远连接距离 100英尺/60米
快反应速度 0.4秒
安卓、苹果、PC、MAC全通用.
收发无字节限制,最高可达3K Bytes/秒
不需要做MFI
IOS系统支持.
Android 4.3系统完美支持.
主从一体模块,具有透传,远控,PIO采集三种功能,通过AT指令集进行切换和设置.
蓝牙串口模块一样,在不改PCB和下位机程序的情况下轻松升级到蓝牙4.0!
蓝牙串口模块,采用TI CC2541,尺寸为28*13*2.3mm