Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ColorSensor.cpp@0:5637e966d2f5, 2021-02-19 (annotated)
- Committer:
- ryousato
- Date:
- Fri Feb 19 09:37:34 2021 +0000
- Revision:
- 0:5637e966d2f5
2021/2/19
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ryousato | 0:5637e966d2f5 | 1 | //メインプログラム・UARTコマンド受信 |
| ryousato | 0:5637e966d2f5 | 2 | #include "mbed.h" |
| ryousato | 0:5637e966d2f5 | 3 | #include <cstdio> |
| ryousato | 0:5637e966d2f5 | 4 | #include "ColorSensor.h" |
| ryousato | 0:5637e966d2f5 | 5 | |
| ryousato | 0:5637e966d2f5 | 6 | #define SirialComSpeed 38400 //シリアル通信のBPS設定 |
| ryousato | 0:5637e966d2f5 | 7 | #define I2Caddr 0x2A //I2Cのアドレス |
| ryousato | 0:5637e966d2f5 | 8 | |
| ryousato | 0:5637e966d2f5 | 9 | RawSerial LedSerial(SERIAL_TX, SERIAL_RX); //シリアル通信 |
| ryousato | 0:5637e966d2f5 | 10 | I2C ColorSensor(PB_9,PB_8); //カラーセンサーのI2C設定(sda,scl) |
| ryousato | 0:5637e966d2f5 | 11 | |
| ryousato | 0:5637e966d2f5 | 12 | //積分時間設定 |
| ryousato | 0:5637e966d2f5 | 13 | //積分時間のベースとなる時間 |
| ryousato | 0:5637e966d2f5 | 14 | //ベース時間×マニュアルタイミング時間で積分時間が決まる |
| ryousato | 0:5637e966d2f5 | 15 | int BaseTimeSelect = 0x00; //ベース時間:0x00で175us,0x01で2.8ms,0x02で44.8ms,0x03で358.4ms |
| ryousato | 0:5637e966d2f5 | 16 | int ManualTime[2] = {0x01,0x1E}; //マニュアルタイミング時間の{上位2byte,下位2byte}:16進数 |
| ryousato | 0:5637e966d2f5 | 17 | int waitTime = 300; //待ち時間、積分時間×4倍より長くする必要あり(ms) |
| ryousato | 0:5637e966d2f5 | 18 | //待ち時間が積分時間に対して短すぎる場合、正しい値が取れない |
| ryousato | 0:5637e966d2f5 | 19 | //※数字が変化しない場合は短すぎる可能性大 |
| ryousato | 0:5637e966d2f5 | 20 | |
| ryousato | 0:5637e966d2f5 | 21 | void CsMode::SensorMain() |
| ryousato | 0:5637e966d2f5 | 22 | { |
| ryousato | 0:5637e966d2f5 | 23 | //周波数設定 |
| ryousato | 0:5637e966d2f5 | 24 | ColorSensor.frequency(100000); |
| ryousato | 0:5637e966d2f5 | 25 | |
| ryousato | 0:5637e966d2f5 | 26 | //送受信用変数 |
| ryousato | 0:5637e966d2f5 | 27 | char rcvData[8]= {0,0,0,0,0,0,0,0}; |
| ryousato | 0:5637e966d2f5 | 28 | char sendData[2]= {0,0}; |
| ryousato | 0:5637e966d2f5 | 29 | |
| ryousato | 0:5637e966d2f5 | 30 | //アドレス設定 |
| ryousato | 0:5637e966d2f5 | 31 | int addr = I2Caddr << 1; //送信用にI2Cのアドレスを上位に1bitシフトする |
| ryousato | 0:5637e966d2f5 | 32 | |
| ryousato | 0:5637e966d2f5 | 33 | //アドレス(addr)に送信,コントロールバイトを指定(0x00),ADCリセット、 |
| ryousato | 0:5637e966d2f5 | 34 | //スリープ解除+積分時間設定(0x80 | BaseTime) |
| ryousato | 0:5637e966d2f5 | 35 | sendData[0] = 0x00; |
| ryousato | 0:5637e966d2f5 | 36 | sendData[1] = 0x80 | BaseTimeSelect; |
| ryousato | 0:5637e966d2f5 | 37 | int tmpVal = ColorSensor.write(addr,sendData,2); |
| ryousato | 0:5637e966d2f5 | 38 | |
| ryousato | 0:5637e966d2f5 | 39 | //カラーセンサーと通信できない場合はエラー終了 |
| ryousato | 0:5637e966d2f5 | 40 | if (tmpVal!=0){ |
| ryousato | 0:5637e966d2f5 | 41 | LedSerial.printf ("ColorSensor Communication Error!!!\r\n"); |
| ryousato | 0:5637e966d2f5 | 42 | return; |
| ryousato | 0:5637e966d2f5 | 43 | } |
| ryousato | 0:5637e966d2f5 | 44 | |
| ryousato | 0:5637e966d2f5 | 45 | //アドレス(addr)に送信,コントロールバイトを指定(0x00) |
| ryousato | 0:5637e966d2f5 | 46 | //マニュアルモード+積分時間設定(0x04 | BaseTime) |
| ryousato | 0:5637e966d2f5 | 47 | sendData[0] = 0x00; |
| ryousato | 0:5637e966d2f5 | 48 | sendData[1] = 0x04 | BaseTimeSelect; |
| ryousato | 0:5637e966d2f5 | 49 | ColorSensor.write(addr,sendData,2); |
| ryousato | 0:5637e966d2f5 | 50 | |
| ryousato | 0:5637e966d2f5 | 51 | //アドレス(addr)に送信,コントロールバイトを指定(0x01),積分時間の上位2Byte |
| ryousato | 0:5637e966d2f5 | 52 | sendData[0] = 0x01; |
| ryousato | 0:5637e966d2f5 | 53 | sendData[1] = ManualTime[0]; |
| ryousato | 0:5637e966d2f5 | 54 | ColorSensor.write(addr,sendData,2); |
| ryousato | 0:5637e966d2f5 | 55 | |
| ryousato | 0:5637e966d2f5 | 56 | //アドレス(addr)に送信,コントロールバイトを指定(0x02),積分時間の下位2Byte |
| ryousato | 0:5637e966d2f5 | 57 | sendData[0] = 0x02; |
| ryousato | 0:5637e966d2f5 | 58 | sendData[1] = ManualTime[1]; |
| ryousato | 0:5637e966d2f5 | 59 | ColorSensor.write(addr,sendData,2); |
| ryousato | 0:5637e966d2f5 | 60 | |
| ryousato | 0:5637e966d2f5 | 61 | //待機 |
| ryousato | 0:5637e966d2f5 | 62 | wait_ms(waitTime); |
| ryousato | 0:5637e966d2f5 | 63 | |
| ryousato | 0:5637e966d2f5 | 64 | //アドレス(addr)に送信,出力データバイトを指定(0x03) |
| ryousato | 0:5637e966d2f5 | 65 | sendData[0] = 0x03; |
| ryousato | 0:5637e966d2f5 | 66 | ColorSensor.write(addr,sendData,1); |
| ryousato | 0:5637e966d2f5 | 67 | |
| ryousato | 0:5637e966d2f5 | 68 | //デバイスに対し8Byteデータを要求 |
| ryousato | 0:5637e966d2f5 | 69 | //データは 赤上位,赤下位,緑上位,緑下位,青上位,青下位,赤外上位,赤外下位の順 |
| ryousato | 0:5637e966d2f5 | 70 | //rcvData配列に0から順に1Byteずつ格納されていく |
| ryousato | 0:5637e966d2f5 | 71 | ColorSensor.read(addr,rcvData,8); |
| ryousato | 0:5637e966d2f5 | 72 | |
| ryousato | 0:5637e966d2f5 | 73 | //受信したデータを表示(1色につき2Byte) |
| ryousato | 0:5637e966d2f5 | 74 | LedSerial.printf ("R:%02x%02x,G:%02x%02x,B:%02x%02x,IR:%02x%02x\r\n", |
| ryousato | 0:5637e966d2f5 | 75 | rcvData[0],rcvData[1],rcvData[2],rcvData[3],rcvData[4], |
| ryousato | 0:5637e966d2f5 | 76 | rcvData[5],rcvData[6],rcvData[7]); |
| ryousato | 0:5637e966d2f5 | 77 | |
| ryousato | 0:5637e966d2f5 | 78 | return; |
| ryousato | 0:5637e966d2f5 | 79 | } |