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

素人組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 (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自己編輯。

後來,把電腦關掉重開就好了。

因為分解動作的程式碼對我來說還是很困難,所以我自己寫號碼上去,一個一個觀察

土法煉鋼的寫出一個抖右腳的動作。