TA
お知らせ
水~金曜日は、実習室を開放できます。
利用のさいは井口研まで
追伸:見事に”秘密”に釣られました・・・
コメント(三上)
記載した人は、括弧をつけて中に名前を書いておくとわかりやすいです。
オジジナルのWikiでは、掲示板やブログなども簡単に実装できるのですが、
FC2の無料Wikiでは、そこまで対応とれていないですね。
PSoCを使った赤外線通信
PSoCを使った赤外線通信について簡単なサンプルと
その説明を書いておきます。
基本的に実習中に学んだ内容で実現できるので、
グローバルリソースやパラメータの設定は各自で
考えてやってみてください。
プロジェクト名:ir_sender_one
・動作
スイッチを押すと赤外線LEDが点灯、放すと消灯。
on/offに合わせてLCDの値が変化する。
・使用モジュール
PWM8 : 38khzの波形を生成するように設定する。
LCD : 0か1か表示するだけ。
・その他
gpio_pollでやったようにSWを使います。
pinの設定を忘れずに。
・配置配線
・基板
・ソース
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define SW 0b00010000
void main(void)
{
PWM8_Start(); LCD_Start(); while(1){ if(PRT1DR & SW){ PWM8_Start(); LCD_Position(0,0); LCD_PrHexInt(1); } else { PWM8_Stop(); LCD_Position(0,0); LCD_PrHexInt(0); } }
}
ファイル名:ir_receiver
・動作
赤外線を受信するとLCDの値が変化する。
受信状態で1、未受信状態で0を表示する。
・使用モジュール
PGA : 赤外線受光素子からの入力を増幅して出力する。
LCD : 0か1か表示するだけ。
・その他
port1.4をpulldownに設定して、port0.3からの出力を
受け取るようにします。
・配置配線
・基板
・ソース
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define SW 0b00010000
void main(void)
{
LCD_Start(); LCD_InitBG(LCD_SOLID_BG); PGA_Start(PGA_HIGHPOWER); PRT1DR &= (~SW); while(1){ if(PRT1DR & SW){ LCD_Position(0,0); LCD_PrHexInt(0); } else { LCD_Position(0,0); LCD_PrHexInt(1); } }
}
MaximaでTwiddle Factorを求める
※ wxMaximaで正しく動作します。
空欄の部分は各自考えてください。
Mの値を変えることによってポイント数を変化させることができます。
ヒント1: コンピュータサイエンス Excise Text4 のp.20を読んでみてください。
(浦野)
wxMaximaでアニメーション
図1: 矩形波
図2: のこぎり波
・ソースコード(矩形波)
with_slider(
end,makelist(i,i,1,30),
sum((4/%pi)*sin((2*k-1)*x)/(2*k-1), k, 1, end),[x,-10,10]
);
・ソースコード(のこぎり波)
with_slider(
end,makelist(i,i,1,30),
sum((2/%pi)*sin(k*x)/k, k, 1, end),[x,-10,10]
);
ImageMagickのパッチをwxMaximaにあてれば、gifファイルを出力できます。
(浦野)
シリアル通信 PSoC - Processing or HSP3
UARTの演習課題でPSoCとPCで通信する手段を学びました.
このとき,PC側ではTera Termというアプリケーションで通信を行いました.
しかし,通信用のプログラムを既存のアプリケーションに依存してしまうと,自由課題に生かしにくくなってしまいます.
ここでは,PC側で通信を担うアプリケーションをProcessingやHSP3を使って自作します.
(2014年度 ハードウェア実習TA 土井)
仕様
1.PSoC側
・UARTを使用し,シリアル通信を行う.
・基本は演習課題"UART_1"と同様.
・文字列の送受信を行う.
・送受信の操作には割り込みを用いない.
2.PC側
・Tera Term同様に文字列の送受信を行う.
・受信された文字列はコンソール,もしくはウインドウに表示.
・キーボードで入力された文字列を送信.
今回使用するソフトウェアのバージョンは以下のとおりである.
PSoC Designer 5.4 Processing 2.2.1 HSP 3.3.2
PSoCの構成
基本は演習課題"UART_1"と同様である.
LCDモジュールを追加し,ソースコードを下記のように書き換える.
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdio.h>
void main(void) {
char *strPtr, ePtr[32]; UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); LCD_Start(); M8C_EnableGInt ; UART_CPutString("Welcome to PSoC UART\r\n"); while(1) { if(UART_bCmdCheck()) { if(strPtr = UART_szGetParam()) { LCD_Init(); LCD_Position(0,0); LCD_PrString(strPtr); csprintf(ePtr, "Echo %s\r\n", strPtr); UART_PutString(ePtr); } UART_CmdReset(); } }
}
UARTにより受信した文字列の先頭に"Echo "を加えてPC側に送信する.
PC側(Processingの場合)
以下にソースコードを記述する.
import processing.serial.*; // ライブラリのインポート
Serial port; // Serialクラスの宣言
String rxBuffer; // 受信用,送信用の文字列を宣言
String txBuffer;
void setup(){
port = new Serial(this, "COM5", 38400); // 通信の接続
}
void draw(){
if(rxBuffer != null) { print(rxBuffer); rxBuffer = null; }
}
void serialEvent(Serial p){ // シリアル通信用のイベント
if(rxBuffer == null) { rxBuffer = port.readString(); // 受信バッファから文字を受け取る } else { rxBuffer = rxBuffer + port.readString(); // 受信バッファから文字を受け取る }
}
void keyPressed(){ // キー入力用のイベント
if(txBuffer == null) { txBuffer = str(key); // 入力されたキーを文字列に格納 } else { txBuffer = txBuffer + key; // 入力されたキーを文字列に追加 } if(key == ENTER) { print(" Send : " + txBuffer); port.write(txBuffer+"\r"); // 送信用の文字列を出力 txBuffer = null; }
}
Processingではシリアル通信用のライブラリとして,"serial"が用意されているため,それをインポートする.
ポートの接続を行う場合はSerialクラスをインスタンス化すればよい.
このとき,コンストラクタの引数で接続するCOMポートと,ボー・レートを指定する.
文字列の送受信にはそれぞれ,write(), readString()メソッドを使う.
write()メソッドを使用するときは,送信文字列の末尾に"\r"もしくは"\n"を付け加えてやる必要がある.
これは,PSoC側で受信を認識するためにこれらの文字が必要となるためである.
readString()メソッドを使う場合,一度にすべての文字列が受信できるわけではないことに注意が必要である.
通信はシリアルに行われるため,受信バッファに存在しない文字列は次のメソッド呼び出しのタイミングで文字列に格納される.
PC側(HSP3の場合)
以下にソースコードを記述する.
#include "hspext.as" comopen 5,"baud=38400 parity=N data=8 stop=1" if stat : dialog"接続エラー" : end sdim rxBuffer, 64 sdim txBuffer, 64 onkey *putdata *main [#h5b8dc51] gosub *getdata await 200 goto *main *getdata [#pb8263a3] comget rxBuffer, 64 if(rxBuffer != "") { mes rxBuffer } return *putdata [#mc2dbf1d] c = strf("%c", iparam) if(iparam == 13) { if(txBuffer != null) { mes " Send : " + txBuffer comput txBuffer+"\r" txBuffer = null } } else { if(txBuffer == null) { txBuffer = c } else { txBuffer += c } } goto *main
Processing同様にライブラリのインクルードを行う.
HSP3ではhspext.asで用意されている.
接続にはcomopen命令を行う.
このとき,COMポートとボー・レートを指定する.
送受信には,comput命令とcomget命令を使用する.
comput命令を使用する場合は,Processing同様に末尾に"\r"または"\n"を加える必要がある.
※ バージョンによっては"\r"ではうまく動かない恐れがある.
comget命令では,受信バッファに格納された文字列を指定した変数に格納する.
Processing同様,受信バッファに届いていない文字列に対しては,次の命令タイミングで受信する.
Processingでは,シリアル通信用のイベントで受信バッファを管理していたが,HSPでは該当するイベントが存在しない.
そのため,await命令を使用して受信バッファへの文字列の格納の時間を稼いでいる.
しかし,停止命令を使用しているため,リアルタイムの通信には向かない.
実行結果
1.Processing
2.HSP3
PSoCでは,特定文字で自動的に文字列を区切る機能がある.
今回の場合では" "(スペース)で区切る.
PSoC側のプログラムで区切られた文字列を順次処理を行わないと,スペースで区切られた2つ目以降の文字列が失われてしまう.
Processing,HSPどちらでも"hello world"という文字列に対して,帰ってきている文字列は"hello"のみである.
考察
ProcessingやHSPは画像や図形を描写したり,操作したりといったグラフィカルなアプリケーションの制作が容易である.
しかし,用意されたライブラリやプログラム言語としての制約は大きく違うため,目的によって使う言語を選択するといいだろう.
Processingでは,シリアル通信用のイベントが用意されており,受信時にデータが切れてしまったり,タイミング毎に処理時間が異なるといったことは無いだろう.
また,出力用のコンソールがデフォルトで用意されているため,CUIプログラミングやデバックも容易である.
AudioやFFTなどのライブラリも存在するため,信号処理系のアプリケーションは容易に実装できる.
HSPでは,Processing以上に型に縛られることが無く,変数型によるコンパイルエラーが少ないため,初心者には簡単に感じるだろう.
また,開発が日本であるため,公式のリファレンスマニュアルが日本語で存在する.
自作ゲームなども多く公開されているため,既存のHSPゲームにPSoCを組み合わせるのも容易にできる.
- 最終更新:2014-12-22 16:16:13