1

Energiaで450円のMSP430 LaunchPadがArduino化した

githubでMSP430 LaunchPadのコードを漁っていたら、Energiaという1年ぐらい前にArduino IDEからforkしたプロジェクトを見つけた。
全然関係ないCPUにArduinoの全命令を移植してあって、メチャクチャ出来が良いのでテンション上がって気合入れた記事書いてしまった。学校の教材として使えるレベルのマイコン環境だと思う。


Energiaのgitリポジトリはここ https://github.com/energia/Energia
試しに作ったプログラムはここ https://github.com/shokai/energia-study


1つ前の記事で書いたMSP430 LaunchPadで、Arduinoのコードが動く。
Arduino系は一番安いSeeduino v2でも1900円するので、もったいなくて1つのボードに色々な機能をがんばって実装するからプログラムが凄いことになってしまう。
MSP430 LaunchPadは共立エレショップで450円で買えるボードなので、ポンポン使い捨てできそうでとても良い。
そもそもRaspberry Piの値段に対してArduinoが高くて何やってんだろ感があって・・・


使ってみた

Getting Started · energia/Energia Wikiを見ながらやった。

http://energia.nu/download/に各OS用のEenrgia IDEとUSBドライバがある。
Mac用をインストールした。USBドライバは前の記事で書いたのと同じ奴だった。
commit logを見るとわりと頻繁に最新のArduinoからmergeしていて、IDEの日本語化も済んでた。
書き込む前に、Energiaの”ツール”メニューからシリアルポート、マイコンボード、書込装置を指定するのを忘れずに。

LEDを交互に点滅させながらAD変換器で明るさを取得し、シリアル通信でMacに送信するプログラムを作ってみた。
サンプルスケッチが大量に入っていたので特に困らなかった。

あっさり動いた。

(上の動画ではSerialPort Serverを使ってフルスクリーンターミナルに表示させている)


サーボモーターも回転させてみた。Known Issuesに乱数系が未実装とあったので、ランダムに動かすのではなく0度と180度を行ったり来たりさせた。
450円のUSB接続サーボコントローラとか、webカメラ回転させたりとかに便利そう。




プログラミング

Hardware · energia/Energia Wiki にピンアサイン情報がある。
各ピンはArduinoと同じく1~20の通し番号が付いていてそれをプログラム上でも使うのだが、基板上の刻印のとおりのP1_0やP2_5といったわかりやすい名前も使える。
P1_系の8本が10bitAD変換器になっている。PWMは7個だが、他のピンからもソフトウェアPWMが出せる。

基板上の赤いLEDや緑色のLEDはP1_0とP1_6に接続されているが、RED_LED・GREEN_LEDというわかりやすい名前でもアクセスできる。プッシュスイッチもPUSH2になってる。
マイコンに温度センサーが内蔵されていて、TEMPSENSORという名前でアクセスできる。ADコンバーターで読んだら309~311の値が返ってきた。450円のUSB温度計としても使えそう。

もっと詳しい情報は付属の2つのマイコン2553と2452のデータシートを見るとよい。
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2553 – TI
16ビット・超低消費電力マイコン MSP430™ – バリュー・ライン – MSP430G2452 – TI

LED点滅

まず動作確認のために、基板上の赤と緑のLEDを交互に点滅させた。
https://github.com/shokai/energia-study/tree/master/led_blink
boolean led_stat;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
led_stat = !led_stat;
delay(1000);
}

シリアル通信

Mac上では /dev/tty.uart-48FF466E374B0C17 として認識されていた。
上の画像の通り、MSP430 LaunchPadに最初から刺さっているマイコンMSP430G2553を使う場合はジャンパピンRXD/TXDを横向きに付け直さなければならない。
箱に入ってるもう一個のマイコン MSP430G2452の場合はジャンパピンはそのままでいい。

LEDを点滅させつつシリアル通信を送受信した。Macから送った文字をMSP430からエコーしている。
https://github.com/shokai/energia-study/tree/master/serial_echo
boolean led_stat;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
}

void loop() {
while(Serial.available()){
Serial.print("echo : ");
Serial.write(Serial.read());
Serial.println("");
}
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
Serial.println(led_stat ? "RED" : "GREEN");
led_stat = !led_stat;
delay(1000);
}


ADコンバータ

シリアル通信でAD変換値を送るプログラム。Analog 7 (P1_7)にCdSを接続した。
https://github.com/shokai/energia-study/tree/master/adc_serial
boolean led_stat;
int ad;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
ad = analogRead(A7);
Serial.println(ad);
led_stat = !led_stat;
delay(100);
}


ソフトウェア・ハードウェアPWM

https://github.com/shokai/energia-study/tree/master/led_pwm

LEDの光量をPWMでフェードさせた。
ハードウェアPWMは上の図の紫色のピンで使えるんだけど、それ以外のピンでanalogWriteするとソフトウェアPWMが使われるらしい。
緑のLEDはなめらかなハードウェアPWMで、赤LEDはソフトウェアPWMになった。赤はあまり綺麗じゃなかった。
void setup() {
}

void loop() {
for(unsigned char i = 0; i < 255; i++){
analogWrite(GREEN_LED, i);
analogWrite(RED_LED, 255-i);
delay(3);
}
for(unsigned char i = 255; i > 0; i--){
analogWrite(GREEN_LED, i);
analogWrite(RED_LED, 255-i);
delay(3);
}
}


サーボモータを動かす

https://github.com/shokai/energia-study/tree/master/servo
この記事の冒頭に書いた動画のやつ。
Servo.hを読み込んで、P2_3にサーボを接続した。ソフトウェアPWMなピンだけど問題なく動いてる。

#include <Servo.h>

Servo servo;
boolean led_stat;
int ad;

void setup() {
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
led_stat = false;
Serial.begin(9600);
servo.attach(P2_3);
}

void loop() {
digitalWrite(RED_LED, led_stat);
digitalWrite(GREEN_LED, !led_stat);
led_stat = !led_stat;
servo.write(led_stat ? 0 : 180);
delay(1000);
}


不具合

Energia IDEを複数開く。プログラムをMSP430に書き込んでいる時に別のEnergia IDEのウィンドウをアクティブにすると、そっちも同時に書き込みを始めてしまう。特にサンプルスケッチをたくさん開いていると暴発しがち。別ウィンドウを触らないように気をつけるしかない。


シリアル通信するプログラムを書き込んだMSP430に、もう一度プログラムを書き込むと
usbutil: unable to find a device matching 0451:f432
というエラーが出て書き込めない。(「マイコンボードへの書き込みが完了しました」という表示は出るが、書き込めていない)
MSP430をUSBから抜き差しすると書き込めるようになる。
Energia IDEのシリアルターミナルから通信を見た後だけ起こって、他のシリアル通信モニタソフトで見た場合は起こらない不具合なので、単にEnergia IDEがシリアルポートを開放し忘れているだけだと思われる。


Macで動いてるVMWare上のUbuntuにMSP430 LaunchPadを接続しようとしたら、そのデバイスIDは既に他のマシンで使われているというメッセージが出て接続できなかった。もともとUSBドライバはデバイスIDを自分で適当に書いてビルドしろという、よくわからない仕様だったのでそのせいかもしれない。

0

PSoC – CY8C29466の14ビットADコンバータを内蔵マルチプレクサで切り替えて複数ピンで使う

14ビットのADコンバータ1つと、AMUX4(4チャンネルアナログマルチプレクサ)を組み合わせると複数のピンからAD変換が使える。
というかPSoC Designer4.xでADCINC12を使っていた頃は、ADCINC12を複数置くことができたのにPSoC Designer5.0では1つしか配置できなくて困った。
でもよく考えたらマルチプレクサ使う方が自然だな。


アナログブロックの接続
マルチプレクサを切り替えるとPort0の0,2,4,6番ピンに接続できる
cfab931ebc6fd7a15179e8377e1a847c


ピン配置
右上のADC以外は関係ない
e9c55cbf49c94421f1ef6f24400f6531


PGAの設定
1.0倍で、AMUXがあるアナログマルチプレクサ1に接続する。
e838b8bcea333aaa21f7249301632629


ADCINCの設定
Negative Inputのソースは一応指定するが、GainをDisconnectedにすると使わないようにできる。
5f959013ed6c5d34154921a08c1cf097


AMUX4の設定
Interconnect Viewには表示されないけど、配置はされてる。アナログマルチプレクサ1として設定する。
ff18fb9db0458d481244adfc38113cfb


AMUX4の他にも8もあるので、まあたくさん増やせる。


UARTのTX8で、14bitADCINCの値を送る。
TX8だけを使う設定は橋本商会 ≫ PSoC – TX8モジュールに書いた

void wait(int n){
    while(n--);
}

// AMUX4_PORT0_0 => 0x00
// AMUX4_PORT0_2 => 0x01
// AMUX4_PORT0_4 => 0x02
// AMUX4_PORT0_6 => 0x03
int get_adc(BYTE amux_channel){
    AMUX4_InputSelect(amux_channel);
    wait(10);
    ADCINC_GetSamples(0);
    while(!ADCINC_fIsDataAvailable());
    return ADCINC_iClearFlagGetData();
}

int ad;
BYTE ad_pin;
char buf[6];

void main(void){
    M8C_EnableGInt;
    AMUX4_Start();
    PGA_1_Start(PGA_1_HIGHPOWER);
    ADCINC_Start(ADCINC_HIGHPOWER);
    TX8_Start(TX8_PARITY_NONE);

    for(;;){
        for(ad_pin = 0; ad_pin < 4; ad_pin++){
            ad = get_adc(ad_pin);
            TX8_PutChar(ad_pin+'0');
            TX8_CPutString(":");
            TX8_PutString(intToStr(ad,buf));
            TX8_PutCRLF();
        }
    }
}
AMUX4を切り替えた直後にAD変換を開始するのがなんとなく嫌だった(物理的に回路が切り替わっているわけだし)ので、一瞬waitを入れてからAD変換するようにした。



string.hのitoa関数がおかしいので代わりを作った
// intの桁数を返す
char getDigit(int n){
    char i;
    i = 0;
    while(n>0){
        n /= 10;
        i++;
    }
    return i;
}

// int->String変換
// char buf[6]
char *intToStr(int n, char *buf){ // 変換する数、作業領域
    int i, digit;
    digit = getDigit(n); // 桁数
    for(i = digit-1; i >= 0; i--){ // intは最大5桁
        buf[i] = n%10+'0';
        n /= 10;
    }
    buf[digit] = '\0'; // 行末
    return buf;
}

0

PSoC CY8C29466のI2CHWモジュールで通信

PSoC CY8C29466のI2Cモジュールを試した。
I2Cは2本の信号線の上にmaster/slaveの2種類のノードを合計100個以上載せて相互に通信できるプロトコル。動作速度が違う部品同士をより少ない結線数で相互接続させる事を目的として、1992年にPhilipsが作って2004年に特許が切れている。今ではほとんどのマイコンにI2C通信をするモジュールがついているし、外部メモリやセンサーなどもI2Cで値を返す物がある。linuxのkernelにも入っていて(/usr/include/linux/i2c.hとか)マザーボード上の温度センサとかに使われているらしい。

このへんに詳しく書いてある。

特に仕様書pdfはちゃんと読んでみたらかなり勉強になったのでオススメ。
プログラムはCypress公式のUser Module Datasheetのp.39,40ものを参考にした。


■作った物
PSoC Designer 5.0+SP6で作ったプロジェクトまるごとgithubに置いた
git clone git://github.com/shokai/i2c-uart-cy8c29466.git
で取得できる。


3つ並んでいるPSoCマイコンのうち一番下がmasterで、上2つがslaveデバイス。デバイスが接続されている2つの線は2kΩの抵抗(1kΩ2つ)を介してVCCと接続されpull upされている。I2Cの接続構成とプルアップ抵抗に適切なプルアップ抵抗の計算方法が書かれている。電源5Vで100kbpsか400kbpsなら2kΩ〜5kΩが最適値とのこと。
R0015277.JPG


masterに付いているボタンを押すと、2つのslaveにLED点灯命令を送る。ボタンを離すと消灯する。
R0015274.JPG


slave側のボタンは、それぞれmasterの2つのLEDの点灯/消灯に対応している。
R0015275.JPG
R0015276.JPG


masterはslaveをコントロールするだけでなく、I2Cとシリアル通信のブリッジになっている。
slaveからのデータをslaveのアドレス名と共にUARTでパソコンに中継する。また、パソコンからmasterマイコンに’U’か’D’の文字を送る事と、masterは全slaveにLED点灯/消灯を送る。
UARTとRS232Cのレベル変換にはADM3202を使った。


だいたいそういう内容のビデオ




■デバイス設定
master側。
I2C master device setting
パソコンとのシリアル通信で9600bpsを作るためにVC1,VC3を設定している。動作電圧やCPUクロックなどはデフォルト値。

I2C master I2CHW module setting
single masterモードでモジュールを置いた。
100kbpsでPORT1の5番と7番ピンをI2Cに使う。bufferはプログラム中で自分で用意したBYTE配列を使ってもらうように設定。

I2C master UART module setting
シリアル通信で9600bpsが出るようにUARTモジュールを設定。
橋本商会 PSoC – CY8C29466でUART受信割り込みでくわしく書いた。

I2C master Pinout setting
3つのLEDに使うピンは出力をStrongにして3V出るようにした。
タクトスイッチにつなぐPort2の2番ピンは両エッジ入力割り込みを設定しつつ内部でプルアップして、ブレッドボード上でも100Ωの抵抗でプルダウンする。こうするとチャタリングが起きない。


I2C master Pin layout
ピン配置図

I2C master modules connection
アナログブロックは使っていないので上の方だけ。
UARTがPort2の4,5番ピンから出るように引き出した。



slave側。
I2C slave device setting
Global Resourceは初期値のまま


I2C slave I2CHW module setting
I2CHWモジュールををslaveで置いた。速度はmasterに合わせる。
slaveデバイスのアドレスは7bitだが、0x00~0x10までの16個のアドレスはプロトコルに予約されているので、0x11からの112個が使える。
今回はmasterのプログラムで0x11~0x20のデバイスがいるか確認しながら動作するようにしているので、アドレス17~32のどれかを使えばいい。


I2C slave Pinout setting
masterと同じ様にLEDとタクトスイッチ用のピンを設定。LEDは1つだけ。


I2C slave Pin layout


I2C slave modules connection
なにも結線していない


■プログラム
master側
slaveアドレス0x11から0x20までのデバイスに、順にTXバッファを書き込み、RXバッファに読み込む。送受信を待っている間、timeout_countをカウントアップし続けて、閾値以上になるとタイムアウトするようにしている。これで存在するかわからないslaveとやりとりできるし、動作中にslaveデバイスが増えても問題なくネットワークに参加させられる。

UARTの受信やピン入力の検出は割り込みで処理している(橋本商会 PSoC – CY8C29466でUART受信割り込みで書いた)のだが、I2Cはメインループの中で処理している。I/OからのイベントでUARTぐらいなら使ってもいいけど、16個のslaveとのやりとりを割り込みの中でやると多重割り込みが起こりやすいので、各ルーチンからbufferを読み書きしてそれを定期的にslaveと共有するという方式にした。
本番ではdigital blockを1つ消費するだけで使える8bit Timerモジュールで定期的に回すようにすると良いと思う。

main.c
// I2C-UART master
// CY8C29466-24PXI(DIP Package)
// PSoC Designer 5.0 + SP6
// IMAGECRAFT C Compiler
#include <m8c.h>        // part specific constants and macros
#include <I2CHW_1Common.h>
#include <I2CHW_1Mstr.h>
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))

#define LED_ON() sbi(PRT2DR, 0) // LED
#define LED_OFF() cbi(PRT2DR, 0)
#define LED2_ON() sbi(PRT1DR, 6)
#define LED2_OFF() cbi(PRT1DR, 6)
#define LED3_ON() sbi(PRT1DR, 4)
#define LED3_OFF() cbi(PRT1DR, 4)

#define BTN_PORT PRT2DR // push button
#define BTN_BIT _BV(2)

#define BUF_SIZE 8
BYTE buf_tx[BUF_SIZE]; // I2C buffer
BYTE buf_rx[BUF_SIZE];
BYTE status; // I2C status
BYTE slave; // slave address
#define I2C_TIMEOUT 128 // 長時間応答が返ってこないslaveデバイスを無視する
BYTE timeout_count, i;

void main(void)
{
    M8C_EnableGInt; // enable global interrupt
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
    UART_1_CmdReset(); // uart init
    UART_1_IntCntl(UART_1_ENABLE_RX_INT); // enable receive interrupt
    UART_1_Start(UART_1_PARITY_NONE);
    LED_ON();
    UART_1_CPutString("start");
    LED_OFF();
    I2CHW_1_Start();
    I2CHW_1_EnableMstr();
    I2CHW_1_EnableInt();
    for(;;){
        for(slave = 0x11; slave < 0x21; slave++){
            I2CHW_1_bWriteBytes(slave, buf_tx, BUF_SIZE, I2CHW_1_CompleteXfer); // master->slave
            timeout_count = 0;
            for(;;){
                if(I2CHW_1_bReadI2CStatus() & I2CHW_WR_COMPLETE ||
                   timeout_count++ > I2C_TIMEOUT) break;
            }
            I2CHW_1_ClrWrStatus();
            
            I2CHW_1_fReadBytes(slave, buf_rx, BUF_SIZE, I2CHW_1_CompleteXfer); // slave->master
            timeout_count = 0;
            for(;;){
                if(I2CHW_1_bReadI2CStatus() & I2CHW_RD_COMPLETE ||
                   timeout_count++ > I2C_TIMEOUT) break;
            }
            I2CHW_1_ClrRdStatus();

            switch(slave){
            case 0x11:
                if(buf_rx[0] == 'u') LED2_OFF();
                else if(buf_rx[0] == 'd') LED2_ON();
                break;
            case 0x12:
                if(buf_rx[0] == 'u') LED3_OFF();
                else if(buf_rx[0] == 'd') LED3_ON();
                break;
            }
            
            while(!(UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY)); // slaveからの受信データをシリアル通信出力
            UART_1_CPutString("I2C:");
            UART_1_PutSHexByte(slave); // slaveアドレス
            UART_1_CPutString(",");
            UART_1_PutString(buf_rx); // slaveからの受信データ
            UART_1_PutCRLF();
            for(i = 0; i < BUF_SIZE-1; i++) buf_rx[i] = '\0'; // 受信バッファを初期化
        }
    }
}


// UART受信割り込み
#pragma interrupt_handler INT_UART_RX
void INT_UART_RX(void){
    char recv_data;
    recv_data = UART_1_cGetChar(); // read UART
    UART_1_PutChar(recv_data); // echo
    switch(recv_data){
    case 'U':
        LED_ON();
        buf_tx[0] = 'A'; // slaveにLED点灯を指示
        UART_1_CPutString("LED:ON\r\n");
        break;
    case 'D':
        LED_OFF();
        buf_tx[0] = 'B'; // slaveにLED消灯を指示
        UART_1_CPutString("LED:OFF\r\n");
        break;
    }
}

// I/Oピン状態変化割り込み
#pragma interrupt_handler INT_GPIO
void INT_GPIO(void){
  if(BTN_PORT & BTN_BIT){ // ボタンが押されている時
    LED_ON();
    buf_tx[0] = 'A'; // slaveにLED点灯を指示
    UART_1_CPutString("LED:ON\r\n");
  }
  else{
    LED_OFF();
    buf_tx[0] = 'B'; // slaveにLED消灯を指示
    UART_1_CPutString("LED:OFF\r\n");
  }
}




slave側
slaveもmasterと同じ様にglobalにバッファを用意して、そこに適当に現在の状態を読み書きし、定期的にメインループ内でmasterと通信し共有している。この方が素直に書きやすい。
LEDとボタンの状態を結びつける情報を1byte目に置いているが、それ以外の情報をやりとりする場合もシリアライズとかして通信するのではなく2byte目以降を使う方がいい。あくまで必要な変数を定期的に同期させられる、分散オブジェクト風に書いた方がすっきりする(PSoCのstring.hがおかしいという理由もあるけど)


あと、ややこしいのがslaveなのでI2CHW_1_InitWrite関数を呼ぶとmasterからslaveへの書き込みが起こる。受信する。送信ではない。また、I2CHW_1_bReadI2CStatus() での状態チェックも、dataに使っている信号線1本の状態のチェックのためなので呼び出すタイミングがmasterと逆になる。このへんややこしいのであまり触りたくないから、通信は隔離された別ループでやってglobalに置いた共用bufferを同期させるという方法にした。

main.c
// I2C-UART slave
// CY8C29466-24PXI(DIP Package)
// PSoC Designer 5.0 + SP6
// IMAGECRAFT C Compiler

#include <m8c.h>        // part specific constants and macros
#include <I2CHW_1Common.h>
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))

#define LED_ON() sbi(PRT2DR, 0) // LED
#define LED_OFF() cbi(PRT2DR, 0)
#define BTN_PORT PRT2DR // push button
#define BTN_BIT _BV(2)

#define BUF_SIZE 8
BYTE buf_rx[BUF_SIZE]; // I2C buffer
BYTE buf_tx[BUF_SIZE] = {'x'};
BYTE status; // I2C status

void main(void)
{
    M8C_EnableGInt;
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
    I2CHW_1_Start();
    I2CHW_1_EnableSlave();
    I2CHW_1_EnableInt();
    for(;;){
        status = I2CHW_1_bReadI2CStatus();
        if(status & I2CHW_WR_COMPLETE){ // master->slave
            I2CHW_1_ClrWrStatus();
            I2CHW_1_InitWrite(buf_rx, BUF_SIZE);
        }
        if(status & I2CHW_RD_COMPLETE){ // slave->master
            I2CHW_1_ClrRdStatus();
            I2CHW_1_InitRamRead(buf_tx, BUF_SIZE);
        }
        if(buf_rx[0] == 'A') LED_ON(); // masterからの指示でLEDの点灯/消灯を切り替え
        else if(buf_rx[0] == 'B') LED_OFF();
    }
}

#pragma interrupt_handler INT_GPIO
void INT_GPIO(void){
    if(BTN_PORT & BTN_BIT){ // ボタンを押している時
        buf_tx[0] = 'd'; // 押下をmasterに通知
    }
    else{
        buf_tx[0] = 'u';
    }
}

0

PSoC – TX8モジュール

UARTモジュールとまるきり同じだけど、TXだけ使うとデジタルブロック1つで済むので節約したい時に使える。
とくにCY8C21334でCapSense (CSD)使うと、digital/analogともに残り1ブロックになるので、このTX8を使うかI2Cでもう1つ別のマイコンとやりとりしてそっちにシリアル通信してもらうかしないとパソコンとやりとりできない。


9600bps出すためのCPU設定。
内蔵24MHz → System Clock → VC1 → VC3と流れて分周していってTX8_1のクロックソースにする
TX8モジュール


Port_0_1まで結線する
TX8モジュール


main.c

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
void main()
{
  TX8_1_Start(TX8_1_PARITY_NONE);
  while(1){
    TX8_1_CPutString("this is test¥r¥n");
  }
}
これだけで8bit パリティ無し ストップビット1で送信できる。


あとは秋月のFT232RL基盤のRXDピンに流せばいい
橋本商会 秋月FT232RL基盤をPSoC CY8C29466で使ってみる


受信できた
TX8モジュール

0

秋月FT232RL基盤をPSoC CY8C29466で使ってみる

秋月のFT232RL基板(AE-UM232R)を使ってみた。

FT232シリーズは、FTDI社製のUSB-UART変換基板。

USBデバイスとしてパソコンからは認識されるが、Win/Mac両対応のVirutal COM Port Driverをインストールすると、シリアルポートとして認識する事ができるようになるので、ArduinoやGainerの部品としても使われている。

写真の通り、周辺回路が全て基板上に実装されているので簡単に使えた。

プログラムはPSoC – CY8C29466でUART受信割り込みと同じものを使用した。

PC側からUSBを通して基盤側に5Vを給電するのもできた。

配線したのはRXD, TXD, VCC, GNDだけで終わりなのでとても楽。

秋月FT232RL基盤+PSoCでUART

Read more