© 法政大学 理工学部 創生科学科 小林一行実験室

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進数で送信されたデータがきちんと受信できていることがわかります。