horikawa
PsoCに磁気、加速度センサを取り付けて無線モジュールでPCと通信を行いました。
磁気センサ、加速度センサからそれぞれX、Y、Zの3チャンネルで出力された値をAMUXで加速度と磁気とを切り替えつつTRIADCを用いてPSoCに取り込みました。
PSoCに取り込んだ信号はPGAで増幅され、TX8から無線モジュールを用いてPCへ送信されます。
使用したツールは"PSoC Designer 5.0"、"PSoC Programmer"、"Tera Term"の3つです。
PSoCでのChip設定はこのようになっています。
Grobal Resourceの設定は以下のようになっています。
Power Setting [Vcc / SysClk] | 5.0V / 24MHz |
CPU_Clock | SysClk/1 |
32K_Select | Internal |
PLL_Mode | Disable |
Sleep_Timer | 512_Hz |
VC1=SysClk/N | 2 |
VC2=VC1/N | 2 |
VC3 Source | VC2 |
VC3 Divider | 78 |
SysClk Source | Internal |
SysClk*2 Divider | No |
Analog Power | SC On/Ref High |
Ref Mux | (Vdd/2)+/-(Vdd/2) |
AGndBypass | Disable |
Op-Amp Bias | High |
A_Buff_Power | High |
SwitchModePump | OFF |
Trip Voltage [LVD (SMP)] | 4.81V (5.00V) |
LVDThrottleBack | Disable |
Watchlog Enable | Disable |
今回は[Vcc/SysClk]の設定は5.0V/24MHzで行い、VC1=2、VC2=2、VC3=78、で9600bpsを作りました。多少の誤差はありますが特に影響があるほどではありませんでした。
PGAのゲインはChipの部分では設定しておらずmain.Cで設定しました。
また、デバッグ用にLCDも使用しました。
PWMとRX8が設置されていますが、今回はこれらは使われません。
使用したモジュールのUser Modules内にある場所を載せておきます。
"TX8" "Digital Comm"
"PGA" "Amplifiers"
"TRIADC" "ADCs"
"LCD" "Misc Digital"
"AMUX4" "MUXs"
PSoCでのmain.Cはこのようになっています。
------------------------------------------------------------------
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
// AD1 port0_1 AD2 port0_4 AD3 port0_5, kasokudo
// port0_3 port0_6 port0_7 jiki
// GND port0_2 extra port0_0 jiki(mux2)
// kasokudo
//AMUX4_1_InputSelect(AMUX4_1_PORT0_1);AMUX4_2_InputSelect(AMUX4_2_PORT0_4);AMUX4_3_InputSelect(AMUX4_3_PORT0_5);
// jiki
//AMUX4_1_InputSelect(AMUX4_1_PORT0_3);AMUX4_2_InputSelect(AMUX4_2_PORT0_6);AMUX4_3_InputSelect(AMUX4_3_PORT0_7);
//AMUX4_2_InputSelect(AMUX4_2_PORT0_0);
// extra jiki
// PGA1 x PGA2 y PGA3z
// PWM 2674, 1337 -> 0.03sec port1_1
// PRT1DR |= 0x0002; // set
// PRT1DR &= 0xfffd; // reset
void TxZeroTerminatedRamString( BYTE * pbStrPtr )
{
while( *pbStrPtr != 0 )
{
TX8_1_SendData( *pbStrPtr );
while( !( TX8_1_bReadTxStatus() & TX8_1_TX_BUFFER_EMPTY ) );
pbStrPtr++;
}
}
void main()
{
int iResult1, iResult2, iResult3;
int i,P11;
int hi1,hi2,hi3;
int lo1,lo2,lo3;
hi1 = hi2 = hi3 = lo1 = lo2 = lo3 = 0;
AMUX4_1_Start();AMUX4_2_Start();AMUX4_3_Start();
//jiki
AMUX4_1_InputSelect(AMUX4_1_PORT0_3);AMUX4_2_InputSelect(AMUX4_2_PORT0_6);AMUX4_3_InputSelect(AMUX4_3_PORT0_7);
PGA_1_SetGain(PGA_1_G1_00);PGA_1_Start(PGA_1_HIGHPOWER);
PGA_2_SetGain(PGA_2_G1_00);PGA_2_Start(PGA_2_HIGHPOWER);
PGA_3_SetGain(PGA_3_G1_00);PGA_3_Start(PGA_3_HIGHPOWER);
PGA_4_SetGain(PGA_4_G1_00);PGA_4_Start(PGA_4_HIGHPOWER);
TRIADC_1_Start(TRIADC_1_HIGHPOWER);
TRIADC_1_SetResolution(10);
// TRIADC_1_GetSamples(0);
LCD_1_Start();
TX8_1_Start(TX8_1_PARITY_NONE);
M8C_EnableGInt;
PWM16_1_DisableInt();
PWM16_1_Start();
// PRT1DR |= 0x0002; // set
// PRT1DR &= 0xfffd; // reset
// jiki
AMUX4_1_InputSelect(AMUX4_1_PORT0_3);AMUX4_2_InputSelect(AMUX4_2_PORT0_6);AMUX4_3_InputSelect(AMUX4_3_PORT0_7);
PGA_1_SetGain(0x0c);PGA_2_SetGain(0x0c);PGA_3_SetGain(0x0c);
for(i=0;;)
{
/*
P11 = (i % 2);
if(P11 == 1) {
PRT1DR |= 0x0002; // set
LCD_1_PrCString((char*)"1");
} else {
PRT1DR &= 0xfffd; // reset
LCD_1_PrCString((char*)"0");
}
*/
P11 = (PRT1DR & 0x02) == 0x02;
i++;
//kasoku
AMUX4_1_InputSelect(AMUX4_1_PORT0_1);AMUX4_2_InputSelect(AMUX4_2_PORT0_4);AMUX4_3_InputSelect(AMUX4_3_PORT0_5);
PGA_1_SetGain(0xC8);PGA_2_SetGain(0xC8);PGA_3_SetGain(0xC8);
LCD_1_Position(0,0);
TRIADC_1_GetSamples(1);
while(TRIADC_1_fIsDataAvailable() == 0); // Wait for data to be ready
iResult1 = TRIADC_1_iGetData1(); // Get Data from ADC Input1
iResult2 = TRIADC_1_iGetData2(); // Get Data from ADC Input2
iResult3 = TRIADC_1_iGetData3ClearFlag(); // Get Data from ADC Input3
// jiki
AMUX4_1_InputSelect(AMUX4_1_PORT0_3);AMUX4_2_InputSelect(AMUX4_2_PORT0_6);AMUX4_3_InputSelect(AMUX4_3_PORT0_7);
PGA_1_SetGain(0x0c);PGA_2_SetGain(0x0c);PGA_3_SetGain(0x0c);
LCD_1_Position(P11,2);
LCD_1_PrHexInt(iResult1);
LCD_1_Position(P11,7);
LCD_1_PrHexInt(iResult2);
LCD_1_Position(P11,12);
LCD_1_PrHexInt(iResult3);
//TX8_1_CPutString((char*)" ");
//TX8_1_SendData(2);
TX8_1_PutSHexInt(i);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(P11);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult1);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult2);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult3);
// TX8_1_CPutString((char*)"\r\n");
TRIADC_1_GetSamples(1);
while(TRIADC_1_fIsDataAvailable() == 0); // Wait for data to be ready
P11 = (PRT1DR & 2)==2; // check port1_1
iResult1 = TRIADC_1_iGetData1(); // Get Data from ADC Input1
iResult2 = TRIADC_1_iGetData2(); // Get Data from ADC Input2
iResult3 = TRIADC_1_iGetData3ClearFlag(); // Get Data from ADC Input3
if(P11 == 1) {
hi1=iResult1;
hi2=iResult2;
hi3=iResult3;
} else {
lo1=iResult1;
lo2=iResult2;
lo3=iResult3;
}
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult1);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult2);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(iResult3);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(hi1-lo1);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(hi2-lo2);
TX8_1_CPutString((char*)" ");
TX8_1_PutSHexInt(hi3-lo3);
TX8_1_CPutString((char*)"\r");
TX8_1_CPutString((char*)"\n");
//TX8_1_CPutString((char*)" ");
//TX8_1_SendData(3);
//TX8_1_CPutString((char*)"\r\n");
{ int jj;
for (jj=1;jj < 120;jj++) LCD_1_Delay50uTimes(120);
}
}
AMUX4_1_Stop();
AMUX4_2_Stop();
AMUX4_3_Stop();
}
------------------------------------------------------------------
使われてない文が多くて申し訳ありません・・・。
無線モジュールの仕様上、送信データ間に無線送信設定時間が入ってしまう為、
for (jj=1;jj < 120;jj++) LCD_1_Delay50uTimes(120);
の1文で50μs*120*120=0.72sのウエイトが入っています。
今回通信に使用したのはAKU-67という無線モジュールです。
動作電圧DC2.2~3.3V、変調速度2400bpsで通信距離が見通し100m、有線での通信プロトコルは9600bpsという仕様になっています。動作電圧がPSoCのほうとは違うので、PSoCの電源から3端子レギュレータを用いて別途3.3Vを製作しました。
そしてAKU-67の受信部からFT232RLというUSB-シリアル変換モジュールを通して信号をPCに取り込んで処理をするという流れになっています。
AKU-67とFT232RLの配線図を以下に示します。
製作した送信部、受信部は以下のようになっています。
携帯で撮った写真なので見難いと思いますがご容赦下さい・・・。
実際の計測した環境です。とても近いです。一応通信距離は見通し100mまでいけるみたいです・・・。
Tera Termを用いてPCが受信したデータを載せます。
16進数で送信されたデータがきちんと受信できていることがわかります。