4/1ですね
17年お世話になったソフトウェア開発の会社を辞めて、広島の実家で働くことにしました。
実家は農業をしています。
最近のシャープ端末のBluetooth
以前のシャープ端末(IS05とか)はBluetoothが何か違うらしく
私の公開しているBluetoothのスタックでうまく動かないことがありましたが
最近の端末は大丈夫なのかもしれない
最近使い始めたAQUOS PHONE ZETA SH-02Eで接続できました
試したマイコン側はこれhrdakinori/PIC24F_MotorControl · GitHub
PIC24F_btstackのマイコン側ソース解説
以前トランジスタ技術やGitHubに公開したBT_IOについて主な処理の解説
PIC24FのUSB HOSTでBluetooth通信を - hrdakinoriのいろいろ
hrdakinori/PIC24F_btstack · GitHub
mPORTxxxなど出てくる関数は、Microchip PIC24F Peripheral Libraryを使用しています
直接レジスタを操作せずにマイコンの周辺機能を使用できます
MPLAB XのXC16コンパイラに入っているライブラリでこのあたりにヘルプがあります
Microchip\xc16\v1.10\docs\periph_lib\Microchip PIC24F Peripheral Library.chm
マイコン側の処理
電源が入るとUSB HOSTでBluetoothのUSBドングルを認識してbtstackを初期化後
BluetoothのSPP(Serial Port Profile)でペアリング待ち状態になります。
USBドングルのLEDが点滅していると接続して通信できる状態のはずです。
スイッチの状態とLEDの点灯、消灯を送受信できます。
ポートの初期化
main.c
int main ( void ) { 〜省略〜 // シリアル通信の送受信ピンの機能割り当て // ログを出力できます // Configure U2RX - put on pin 17 (RP8) RPINR19bits.U2RXR = 8; // Configure U2TX - put on pin 16 (RP7) RPOR3bits.RP7R = 5; // アナログポートとI/Oピンの共有ピンをI/Oに変更 // Analog IN Disable AD1PCFG = 0xffff; // スイッチの入力ピンのプルアップを有効に EnablePullUpCN12; // LED接続ピンを出力に // Port output setup mPORTBOutputConfig(0x8000); 〜省略〜 }
スイッチの監視とSPPへの送信
sw_processは定周期に呼ばれます
ポートの変化があったらSPPで送信します。
swcountをカウントダウンして、チャタリング防止にポートの変化検出後しばらく見ないようにしています
main.c
static int sw_process(struct data_source *ds) { static short swcount; static short lastsw; if(swcount == 0) { // ポートのデータ読み出し short sw = mPORTBReadBit(0x4000); // 変化があったら if(sw != lastsw) { // スイッチの接続ピンの場合 if(sw == 0x4000) { // SPPでデータ"S0"を送ります bt_spp_send((uint8_t*)"S0",2); }else{ // SPPでデータ"S1"を送ります bt_spp_send((uint8_t*)"S1",2); } // スイッチを監視しないカウント回数 swcount = 1500; // 現在の値を保存しておきます lastsw = sw; } } if(swcount != 0) { // カウントダウン swcount--; } return 0; }
SPPからの受信
SPPからデータを受信するとbt_spp_recive_callbackが呼ばれます
packetに受信データ、sizeに受信サイズが入っています。
大きなデータは分割されて届く可能性があります
bt_spp.c
int bt_spp_recive_callback(uint16_t channel, uint8_t *packet, uint16_t size) { packet[size] = 0; // 0番目のデータによって処理を分ける(今回は'l''L'のみ) // 送られてくるデータが"L1","L0"または"l1","l0"を想定 switch(*(packet+0)) { case 'l': case 'L': // 1番目のデータが'1'の場合 if(*(packet+1) == '1') { // LEDの接続されているポートを1に mPORTBSetBits(0x8000); }else{ // LEDの接続されているポートを0に mPORTBClearBits(0x8000); } break; } return 0; }
装置名の変更
ここの文字を変更すると認識される装置名が変わります
bt_spp.c
void bt_packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) { 〜省略〜 // USBドングルのアドレス下2桁でフォーマット if ( COMMAND_COMPLETE_EVENT(packet, hci_write_class_of_device) ) { sprintf(bt_localname,"PICBT%04x",bt_localid); hci_send_cmd(&hci_write_local_name, bt_localname); } if (COMMAND_COMPLETE_EVENT(packet, hci_read_bd_addr)){ bt_flip_addr(event_addr, &packet[6]); bt_localid = ((event_addr[4] << 8) | event_addr[5]); // printf("BD-ADDR: %s\n\r", bd_addr_to_str(event_addr)); break; } 〜省略〜 }
PIN番号の変更
ここの文字を変更するとPIN番号が変わります
bt_spp.c
void bt_packet_handler (void * connection, uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size) { 〜省略〜 hci_send_cmd(&hci_pin_code_request_reply, &event_addr, 4, "0000"); 〜省略〜 }
ペアリングの改善
このあたりを見てみるとよいかもです。
スキータイム計測機 開発日誌 トラ技9月号のBT_IOのペアリングを自動化する
leibunのテクニカルブログ: BTSTACKのペアリングを簡単にしてみる
秋月のBlueBoard-RX62Nを試す
去年紹介した
秋月の新しいRXマイコン基板 - hrdakinoriのいろいろ
CPUはルネサスのRX62シリーズ、フラッシュ512KB RAM96KでUSBやEthernetもついてる
BlueBoard−RX62N_100pin: マイコン関連 秋月電子通商 電子部品 ネット通販
残念ながらUSB TypeAコネクタがついていないのでつけてUSB HOSTを試してみた
100pinが引き出してあるのだが5Vを供給することができないようなのでレギュレータに直接配線した
とりあえずルネサスのUSB機能のアプリケーションノートR01AN0512JJ0200 nonOS版のソースをCubeSuite+でコンパイルできるようにして試してるのだけどうまくいかない
前に作ったTOPPERS+アプリケーションノートR01AN0512JJ0110を書き込むと動くんだけどなぁ
GitHubのPIC24F_btstackを更新
秋月の新しいRXマイコン基板
少し前に秋月に新しいRXマイコン基板が追加されたようです。
NGXのBlueBoard-RX62N_100pinってやつです。
価格は1980円で、基板は小さいし全ピン引き出されているのでいい感じ JTAGもすぐに接続できる
BlueBoard-RX62N_100pin: マイコン関連 秋月電子通商 電子部品 ネット通販
ADK勉強会のもくもく時間で触ってみました。
サンプルプログラムがここにあるらしい
NGX Technologies Online Store