【風速計2019】実装基板完成<BlueToothでスマホログ>

お盆中に完成させて、実走行テストしようとしているのですが、
台風10号のおかげで、17日土曜日以降となりそうです。
風速なので、ローラ台では、テストできないので実走行する以外に動作試験できません。3年前の実績があるので、そこそこ使えることは分っているのですが、3年前は、サイクリングに使うほど実走行をしてないので、今回は、実使用に耐える試作品ということを狙ってます。

●実装基板特徴

①LCDの下側にCPU基板を配置します。

②実装密度を目いっぱいあげました。

使用デバイスは、
1:CPU(LPC1114FN28)
2:3.3VDCDC昇圧コンバータ
3:マイクロSDカードドライブ
4:単四電池ケース
この基板で、
1、LCD(ACM1602NI)
2、OMRON D6FPH微差圧センサ
3、リードスイッチ車速センサ
5、クラシックBTモジュール

●SDマイクロプログラムでかくてコンパイルエラー
LPC1114FNは、32Kフラッシュしかないので、大きなライブラリーを使うと、容量オーバーになりました。SDFileSystemが大きくて
コンパイルできなくなりました。代替え案として、
①別のCPUに変更=>お盆中にできなくなるので今回は却下
②シリアルIFでデータを他に送信して、スマホでログ
=>BTモジュールでSPPでスマホに受信させるのは簡単
※昨年仕入れておいた中華BTモジュールです。技適非対応ですが、技適は、数年後に緩和されるはずなので、中華BTを使っていてもお咎めはないはずだと踏んで使ってます。
amazon でHC-06を買ったつもりですが、送られてきたモノが違っていてBT-04というモジュールでした。RXとTXをマイコンとつないで、シリアル転送するだけなので、何も設定いらずで通信でるので、簡単でいいです。今回はTxとRXを間違えて結線して10分ほどロスしました。3.6V-6Vとか書いてありますが、3.3Vで通信できてます。デフォルトは9600bpsです。


③シリアルIFとパワーメーター用マイコンと通信させて、
双方向通信で、風速と速度データをパワーメーターマイコンでログ=>SeatTubet型システムが完成したら採用。

ということで②の方式でくみ上げました

●動作テスト
LPC1114FNは、電源オンでは、LCDが動作しなくて、RESETボタンを設けておかないといけないようです。RESETしてからLCD表示始まります。
BlueToothの受信は、アンドロイドスマホで
アプリSerial BlueTooth Terminalというアプリを使ってみました。

今までBlueTermを使っていたのですが、他のアプリも試してみました。周期は、500msecに一回なので
9600bpsでも十分間に合います。
タイムスタンプをついているので、サイコンデータと同期しやすいので、これで風速データとサイコンデータを比較分析すると向かい風でのロスがみえると思います。

●mbed LPC1114FN用プログラム備忘録
使っているライブラリは、ACM1602.hだけです。

//実装接続プログラム2016/10/16 rev.1.0
//単一プログラムでライブラリー化せず
// ********************Wind meter*****************************
// Target LPC1768
// 1)ACM1602NI (I2C text LCD library)
// Takuo WATANABE (wtakuo)
// http://mbed.org/users/takuo/code/ACM1602NI/
// 2)SD FIle read/write
// Junichi Katsu “超お手軽マイコンmbed入門”P60~
//example writing to SD card, sford
// 3)Frequency Counter x2ch
// Neel Shah
//https://developer.mbed.org/users/Neel/code/Frequency_counter/
// 4)OMRON D6F-PH5050 I2C diff pressure meter
// Kunihiko Matsuhashi
//*************************************************************
//————————————Header ———————————–#include “mbed.h”
#include “ACM1602NI.h”
#include “SDFileSystem.h”
#define D6F_ADDR 0xD8 //I2Cアドレス定義
I2C i2c1(dp5,dp27);
//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
//DigitalOut pinout(p19);
ACM1602NI lcd(dp5, dp27);//I2C LCD
//SDFileSystem sd(dp2, dp1, dp6, dp25, “sd”); // the pinout on the mbed Cool Components workshop board
Serial BT(dp16, dp15);//BT SPP serial
//InterruptIn in1(p16); //Wind sensor
InterruptIn in2(dp26);//Wheel encoder
//Timer t1;//for Wind sensor
Timer t2;//for Wheel encoder
//————————-const 定義————————————//
//float t1_period = 0; // This is the period between interrupts in microseconds
//float t1_freq = 0;
float t2_period = 0; // This is the period between interrupts in microseconds
float t2_freq = 0;
float Wind_speed=0;
float Wheel_speed=0;
float pitos=0;
float mitudo=0;
float tmpr=20;
float Cof=0.9;
int wtime=500;
static const char d6f_config[5]={0x00,0xD0,0x40,0x18,0x06};
static const char d6f_comp_read[4]={0x00,0xD0,0x51,0x2c};//差圧データx51hを指定
static const char d6f_temp_read[4]={0x00,0xD0,0x61,0x2c};//温度テータx61hを指定
static const char d6f_mem_read[1]={0x07};//リードレジスタx07hから読む
static const char d6f_init[2]={0x0B,0x00};//初期化レジスタx0Bhをx00でリセット
//—————————————————————————–
//初期化関数//

uint8_t d6fph_strt(void) {
uint8_t error;

//D6F-PHのレジスタ通信データを宣言・初期化する

error=i2c1.write(D6F_ADDR,d6f_init,2);
return(error);
}

//差圧読み込み関数//
float read_pressure(void) {
char error;
char rdata[2];
uint16_t raw_diff_pa;
float diff_pa;
error=i2c1.write(D6F_ADDR,d6f_config,5);
wait_us(33000);
error=i2c1.write(D6F_ADDR,d6f_comp_read,4);
error=i2c1.write(D6F_ADDR,d6f_mem_read,1,true);
error=i2c1.read(0xD9,rdata,2);
if (error){
return(error);
}
raw_diff_pa=(rdata[0]<<8)+rdata[1];
diff_pa=((float)raw_diff_pa-1024)/60-500;
return(diff_pa);
}
//温度読み取り関数//
float read_d6f_temp(void) {
char error;
char rdata[2];
uint16_t raw_ref_temp;
float ref_temp;

i2c1.write(D6F_ADDR,d6f_config,5);
wait_us(33000);
error=i2c1.write(D6F_ADDR,d6f_temp_read,4);
error=i2c1.write(D6F_ADDR,d6f_mem_read,1,true);
error=i2c1.read(0xD9,rdata,2);
if(error){
return(error);
}
raw_ref_temp=(rdata[0]<<8)+rdata[1];
ref_temp=((float)raw_ref_temp-10214)/37.39;
return(ref_temp);
}

//cout関数
/*void flip1(void)//TIMER WIND
{
led1=!led1;
pinout=!pinout;
t1_period = t1.read_us(); // Get time since last interrupt
//pc.printf(“t1_read_us=%5.1f\n”,t1_period);
t1_freq = (1/t1_period)*1000000; // Convert period (in us) to frequency (Hz)
t1.reset(); // Reset timer and wait for next interrupt
}
*/
//——————————-
void flip2(void)//TIMER WHEEL
{
// led2=!led2;
t2_period = t2.read_us(); // Get time since last interrupt
t2_freq = (1/t2_period)*1000000; // Convert period (in us) to frequency (Hz)
t2.reset(); // Reset timer and wait for next interrupt
}
//関数定義終わり—————————//

//————————-main—————————
// データ読みこみ毎にLEDが点滅する

int main() {
BT.baud(9600);
float prs;
int i=0;
prs=0;
// mkdir(“/sd/mydir”, 0777);
//in1.mode(PullDown); // Set the pin to Pull Down mode.
//in1.rise(&flip1); // Set up the interrupt for rising edge
in2.mode(PullUp); // Speed SensorSet the pin to Pull Down mode.
in2.rise(&flip2); //Speed Sensor Set up the interrupt for rising edge
//t1.start();
// start the timer1
t2.start(); //start the timer 2
// FILE *fp = fopen(“/sd/mydir/sdtest.csv”, “w”);
// fprintf(fp,”Wind speed ,Pressure,temp,Wheelspeed,wtime%d\n”,wtime);
// fclose(fp);

while(1){
wait_ms(wtime);

//Wind_speed=t1_freq*0.0577;
//if(t2_freq<0.31 or t2_freq>20) t2_freq=0;
//

Wheel_speed=t2_freq*0.11644;//2.096/18;

d6fph_strt();
prs=read_pressure();//差圧データ読んで代入////
tmpr=read_d6f_temp();//温度データ読んで代入//
mitudo=353/(273+tmpr);
pitos=Cof*sqrt(2*prs/mitudo);
lcd.locate(0,0);
lcd.printf(“Pito:Bike:<%2.1f>\r\n”,Wheel_speed-pitos);
lcd.locate(0,1);
lcd.printf(“%2.1f,%2.1f,%d\r\n”,pitos,Wheel_speed,i);
//lcd.printf(“\r\n”);
BT.printf(“%2.1f,%2.1f\r\n”,pitos,Wheel_speed);

//fp=fopen(“/sd/mydir/sdtest.csv”, “a”);
//fprintf(fp,”%2.1f,%2.1f,%2.1f\n”,pitos,tmpr,Wheel_speed);
//fclose(fp);
i++;
}
}

●以後
土日で練習で使って、実使用での課題抽出します。
それ以降は、SeatTube型パワーメーターと合体する作業を8月末までに完成させたいと思います。 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です