為了讓OTTO發出不同的聲音,想要用無源蜂鳴器發出音樂
找到了將MIDI轉換成TONE程式碼的網站
先到底下網站抓midi檔
https://musescore.com/dashboard
然後到底下網站,將midi檔轉成arduino的tone函數用的程式碼
https://extramaster.net/tools/midiToArduino/
2018年12月20日 星期四
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」
底下是從購買模組的網站抓來的內容。
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为回车换行。
素人組Otto
我最早是到thingiverse的網站抓3D圖檔,
https://www.thingiverse.com/thing:2398231
但是發現底下的網站還有其他的類型
https://wikifactory.com/+OttoDIY#project
而要找程式碼時,是到雲林SONG去抓的,
https://yunlinsong.blogspot.com/2016/12/arduino-otto.html
因為整個過程紊亂且資訊散落,自己又記不住這麼多,所以寫一篇作為紀錄
要注意的是,藍芽的HC-05跟HC-06設定,會因為買到的模組版本不一樣,連接時的設定也會不一樣,我以為比較簡單的HC-06一直無法穩定連線,反而是HC-05順利成功,因為要進入AT MODE設定,而HC-05跟HC-06進入的方法不一樣,另外早期買的藍牙模組CC41-A跟新版的android無法連線,這些問題就開不同文章記錄。
基本上,想要玩藍芽遙控的OTTO只需要可以連線就好,不管是哪一種規格,只要先設定好連線用的名稱跟密碼就可以,還有一個要注意的是藍牙直接連到RX跟TX,所以想把程式傳送到arduino的時候,需要把藍牙模組拔掉,不然沒辦法順利傳進去。
藍芽的連線設定說明寫在另外一篇,
完成底下設定的內容就好
設定名稱:"AT+NAME=Zowi"
設定密碼:"AT+PSWD=1234"
設定速率:"AT+UART=115200,1,0"
雖然安裝Otto的影片網路上很多,但是大部分就比較簡略,底下這個影片應該是一個素人安裝的,所以比較仔細,不過最好先看完一次,因為他嘗試好幾次才會對,先看完才不會跟著一起嘗試錯誤。
https://www.hackster.io/ottoplus/otto-diy-arduino-bluetooth-robot-easy-to-3d-print-33406c
還有,在做了三隻之後,個人經驗是不用先校正馬達,而是邊安裝邊校正,我是分階段進行,先安裝上股關節的馬達,校正後再把撥片裝上去,接著安裝膝蓋關節的馬達,校正後再把撥片裝上去,如果先校正好再安裝,在過程中可能會動到,安裝撥片上去就不準了。
依據行進方式跟外觀的不同,我分成三種類型,因為寫程式的時候要分清楚
1.兩隻腳
2.兩隻腳跟兩隻手
3.輪胎或履帶
一開始安裝的時候,也是糊里糊塗的,每個程式都不清楚,最後我只有使用底下兩個
OTTO_ServoHome:這是校正馬達用的
OTTO_BT :這是有藍芽連線功能,測試的時候,好幾個功能不能用,比如MODE
安裝好mBlock之後,要讓它認識otto的功能的話,還要安裝extension裡面的ottodiy,接著把arduino相關的功能都安裝好之後,就可以連線,把程式碼傳過去了
我是看底下的影片才有點概念
https://www.youtube.com/watch?v=6cpj8iwdlck
基本款就是會走跟偵測前方障礙物,雖然還有其他,但是我只看到touch sensor跟麥克風,而RGB LED我就不知道要裝哪裡。
在進化一點,就有表情了,一樣都可以在底下網站找到各種外型
https://wikifactory.com/+OttoDIY#project
https://yunlinsong.blogspot.com/2018/01/otto.html
說實話,對於不是本科系的我看得很吃力,只好按部就班的一個一個寫下來
OTTO_BT是用藍芽控制otto的動作,裡面預設20種,在接收到藍芽指令之後,做出相對應的動作,就是底下這段程式碼
void move(int moveId){
bool manualMode = false;
switch (moveId) {
第17個的動作是
case 17: //M 17 500
Otto.shakeLeg(1,T,1);
呼叫了shakeleg函式,帶有三個參數,於是搜尋otto.cpp,發現了底下的程式碼
//---------------------------------------------------------
//-- Otto gait: Shake a leg
//-- Parameters:
//-- steps: Number of shakes
//-- T: Period of one shake
//-- dir: RIGHT=Right leg LEFT=Left leg
//---------------------------------------------------------
void Otto::shakeLeg (int steps,int T,int dir){
//This variable change the amount of shakes
int numberLegMoves=2;
//Parameters of all the movements. Default: Right leg
int shake_leg1[4]={90, 90, 58, 35};
int shake_leg2[4]={90, 90, 58, 120};
int shake_leg3[4]={90, 90, 58, 60};
int homes[4]={90, 90, 90, 90};
//Changes in the parameters if left leg is chosen
if(dir==-1)
{
shake_leg1[2]=180-35;
shake_leg1[3]=180-58;
shake_leg2[2]=180-120;
shake_leg2[3]=180-58;
shake_leg3[2]=180-60;
shake_leg3[3]=180-58;
}
//Time of the bend movement. Fixed parameter to avoid falls
int T2=1000;
//Time of one shake, constrained in order to avoid movements too fast.
T=T-T2;
T=max(T,200*numberLegMoves);
for (int j=0; j<steps;j++)
{
//Bend movement
_moveServos(T2/2,shake_leg1);
_moveServos(T2/2,shake_leg2);
//Shake movement
for (int i=0;i<numberLegMoves;i++)
{
_moveServos(T/(2*numberLegMoves),shake_leg3);
_moveServos(T/(2*numberLegMoves),shake_leg2);
}
_moveServos(500,homes); //Return to home position
}
delay(T);
}
本來想試著照樣自己做個動作,竟然出現
compilation terminated.
編譯時發生錯誤
In file included from Otto.cpp:10:0:
Otto.h:6:20: fatal error: EEPROM.h: No such file or directory
#include <EEPROM.h>
但是,我明明沒有看到include otto.h,而且在寫otto程式的時候,也不會出現錯誤,在交叉比對之下,發現mblock並沒有把EEPROM 給include進來,只好打開arduino IDE自己編輯。
後來,把電腦關掉重開就好了。
因為分解動作的程式碼對我來說還是很困難,所以我自己寫號碼上去,一個一個觀察
土法煉鋼的寫出一個抖右腳的動作。
https://www.thingiverse.com/thing:2398231
但是發現底下的網站還有其他的類型
https://wikifactory.com/+OttoDIY#project
而要找程式碼時,是到雲林SONG去抓的,
https://yunlinsong.blogspot.com/2016/12/arduino-otto.html
因為整個過程紊亂且資訊散落,自己又記不住這麼多,所以寫一篇作為紀錄
要注意的是,藍芽的HC-05跟HC-06設定,會因為買到的模組版本不一樣,連接時的設定也會不一樣,我以為比較簡單的HC-06一直無法穩定連線,反而是HC-05順利成功,因為要進入AT MODE設定,而HC-05跟HC-06進入的方法不一樣,另外早期買的藍牙模組CC41-A跟新版的android無法連線,這些問題就開不同文章記錄。
基本上,想要玩藍芽遙控的OTTO只需要可以連線就好,不管是哪一種規格,只要先設定好連線用的名稱跟密碼就可以,還有一個要注意的是藍牙直接連到RX跟TX,所以想把程式傳送到arduino的時候,需要把藍牙模組拔掉,不然沒辦法順利傳進去。
藍芽的連線設定說明寫在另外一篇,
完成底下設定的內容就好
設定名稱:"AT+NAME=Zowi"
設定密碼:"AT+PSWD=1234"
設定速率:"AT+UART=115200,1,0"
雖然安裝Otto的影片網路上很多,但是大部分就比較簡略,底下這個影片應該是一個素人安裝的,所以比較仔細,不過最好先看完一次,因為他嘗試好幾次才會對,先看完才不會跟著一起嘗試錯誤。
https://www.hackster.io/ottoplus/otto-diy-arduino-bluetooth-robot-easy-to-3d-print-33406c
還有,在做了三隻之後,個人經驗是不用先校正馬達,而是邊安裝邊校正,我是分階段進行,先安裝上股關節的馬達,校正後再把撥片裝上去,接著安裝膝蓋關節的馬達,校正後再把撥片裝上去,如果先校正好再安裝,在過程中可能會動到,安裝撥片上去就不準了。
依據行進方式跟外觀的不同,我分成三種類型,因為寫程式的時候要分清楚
1.兩隻腳
2.兩隻腳跟兩隻手
3.輪胎或履帶
一開始安裝的時候,也是糊里糊塗的,每個程式都不清楚,最後我只有使用底下兩個
OTTO_ServoHome:這是校正馬達用的
OTTO_BT :這是有藍芽連線功能,測試的時候,好幾個功能不能用,比如MODE
如果不使用藍芽遙控功能,而是要自己編輯動作寫程式的話,我是使用mblock (mBlock 3 for PC),
http://www.mblock.cc/mblock-software/安裝好mBlock之後,要讓它認識otto的功能的話,還要安裝extension裡面的ottodiy,接著把arduino相關的功能都安裝好之後,就可以連線,把程式碼傳過去了
我是看底下的影片才有點概念
https://www.youtube.com/watch?v=6cpj8iwdlck
基本款就是會走跟偵測前方障礙物,雖然還有其他,但是我只看到touch sensor跟麥克風,而RGB LED我就不知道要裝哪裡。
在進化一點,就有表情了,一樣都可以在底下網站找到各種外型
https://wikifactory.com/+OttoDIY#project
拆解OTTO的動作
除了預設好的動作之後,因為自己也想試試看有沒有其他動作,所以就繼續參考雲林SONG的說明https://yunlinsong.blogspot.com/2018/01/otto.html
說實話,對於不是本科系的我看得很吃力,只好按部就班的一個一個寫下來
OTTO_BT是用藍芽控制otto的動作,裡面預設20種,在接收到藍芽指令之後,做出相對應的動作,就是底下這段程式碼
void move(int moveId){
bool manualMode = false;
switch (moveId) {
第17個的動作是
case 17: //M 17 500
Otto.shakeLeg(1,T,1);
呼叫了shakeleg函式,帶有三個參數,於是搜尋otto.cpp,發現了底下的程式碼
//---------------------------------------------------------
//-- Otto gait: Shake a leg
//-- Parameters:
//-- steps: Number of shakes
//-- T: Period of one shake
//-- dir: RIGHT=Right leg LEFT=Left leg
//---------------------------------------------------------
void Otto::shakeLeg (int steps,int T,int dir){
//This variable change the amount of shakes
int numberLegMoves=2;
//Parameters of all the movements. Default: Right leg
int shake_leg1[4]={90, 90, 58, 35};
int shake_leg2[4]={90, 90, 58, 120};
int shake_leg3[4]={90, 90, 58, 60};
int homes[4]={90, 90, 90, 90};
//Changes in the parameters if left leg is chosen
if(dir==-1)
{
shake_leg1[2]=180-35;
shake_leg1[3]=180-58;
shake_leg2[2]=180-120;
shake_leg2[3]=180-58;
shake_leg3[2]=180-60;
shake_leg3[3]=180-58;
}
//Time of the bend movement. Fixed parameter to avoid falls
int T2=1000;
//Time of one shake, constrained in order to avoid movements too fast.
T=T-T2;
T=max(T,200*numberLegMoves);
for (int j=0; j<steps;j++)
{
//Bend movement
_moveServos(T2/2,shake_leg1);
_moveServos(T2/2,shake_leg2);
//Shake movement
for (int i=0;i<numberLegMoves;i++)
{
_moveServos(T/(2*numberLegMoves),shake_leg3);
_moveServos(T/(2*numberLegMoves),shake_leg2);
}
_moveServos(500,homes); //Return to home position
}
delay(T);
}
compilation terminated.
編譯時發生錯誤
In file included from Otto.cpp:10:0:
Otto.h:6:20: fatal error: EEPROM.h: No such file or directory
#include <EEPROM.h>
但是,我明明沒有看到include otto.h,而且在寫otto程式的時候,也不會出現錯誤,在交叉比對之下,發現mblock並沒有把EEPROM 給include進來,只好打開arduino IDE自己編輯。
後來,把電腦關掉重開就好了。
因為分解動作的程式碼對我來說還是很困難,所以我自己寫號碼上去,一個一個觀察
土法煉鋼的寫出一個抖右腳的動作。
訂閱:
文章 (Atom)