#contents //もくじです #pcomment(reply) //こめんとです *2014/4/26 I2CカラーセンサS11059−02DTの使い方 [#de0b747a] -irone用。I2Cで動く。色の対応が面倒くさかったので載せておく。 参考URL:http://blog.kemushicomputer.com/2013/08/i2c.html ~ 前提として、3オクターブに合わせる為36種類ぐらいの色が欲しい ~ →RGBで考えると3*3*4ぐらいが妥当 ~ →直接取ってきた値を吟味しても上手くいかない(明るさによって同じ色が違う値になる,そもそも65535付近の明るさに行かない) ~ →赤外線信号を取って来れるという便利な機能に気付く。明るさによって変化するのか ~ →きれいに変化した。というわけでrgb値/IR値で補正できる。また、その値は大体0〜12の範囲に収まる ~ →これを3*3*4等分したものを最終的な色判断に使う ~ /******************************************************************************* * * S11059_02dt I2C color sensor test sketch v20130818 by KentN * * http://www.hamamatsu.com/jp/ja/product/new/S11059-02DT/index.html (Ja * http://www.hamamatsu.com/jp/en/product/new/S11059-02DT/index.html (EN * * tested boards * MSP430 LaunchPad(G2553) (Energia IDE 0101E009 & patched latest MSP430/cores library) * Arduino 1.0 or later (need 3.3V board or I2C level converter) * * MSP430LaunchPad (& Energia) * before enabling I2C bus, remove led2 JUMPER PIN * Energia IDE must be patched with latest cores library on github * (In energiaIDEdirectory/hardware/MSP430/cores) ********************************************************************************/ #include "Wire.h" #define device_address 0x2A #define control_reg 0x00 /* //色の種類。3オクターブに合わせて36種類になっている #define black 0 #define dark_blue 1 #define navy 2 #define blueblue 3 #define greenteamilk 4 #define emerald 5 #define sky 6 #define aqua 7 #define yellowgreen 8 #define lightemerald 9 #define shallowsea 10 #define lightaqua 11 #define redblack 12 #define lightredpurple 13 #define lightpurple 14 #define lightbluepurple 15 #define mastard 16 #define ash 17 #define lightblueash 18 #define lightbluewhiteash 19 #define neonyellowgreen 20 #define lightashyellowgreen 21 #define lightashemerald 22 #define lightashwhiteblue 23 #define redred 24 #define pink 25 #define pinkpurple 26 #define purple 27 #define orange 28 #define fleshcolor 29 #define whitepink 30 #define kirby 31 #define yellow 32 #define lightyellow 33 #define verylightyellow 34 #define white 35 */ //センサーからの値を持ってくる。16bitなので0〜65535 uint16_t red = 0; uint16_t green = 0; uint16_t blue = 0; uint16_t IR = 0; //センサーのRGB値から色を決定する際に使う uint16_t r = 0; uint16_t g = 0; uint16_t b = 0; //group センサーから補正後の値が大体12ぐらいまでなので、 uint16_t r_1 = 4; uint16_t r_2 = 8; uint16_t r_3 = 20; uint16_t g_1 = 4; uint16_t g_2 = 8; uint16_t g_3 = 20; uint16_t b_1 = 3; uint16_t b_2 = 6; uint16_t b_3 = 9; uint16_t b_4 = 20; uint16_t color = 0; uint16_t colorGroup[3][3][4] = { { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }, { {12,13,14,15}, {16,17,18,19}, {20,21,22,23} }, { {24,25,26,27}, {28,29,30,31}, {32,33,34,35} } }; void getRGB(); void getColor(); void getColor() { if(red <= r_1){r = 0;} else if(red <= r_2){r = 1;} else if(red <= r_3){r = 2;} if(blue <= b_1){b = 0;} else if(blue <= b_2){b = 1;} else if(blue <= b_3){b = 2;} else if(blue <= b_4){b = 3;} if(green <= g_1){g = 0;} else if(green <= g_2){g = 1;} else if(green <= g_3){g = 2;} color = colorGroup[r][g][b]; } void setup() { Wire.begin(); Serial.begin(9600); } void loop() { getRGB(); Serial.print(red); Serial.print(','); Serial.print(green); Serial.print(','); Serial.print(blue); Serial.print(','); Serial.println(IR); red= red/IR; green=green/IR; blue=blue/IR; getColor(); Serial.print(red); Serial.print(','); Serial.print(green); Serial.print(','); Serial.print(blue); Serial.print(','); Serial.println(color); delay(500); } void getRGB() { uint16_t colordata= 0; //この辺のプロトコルはデータシートに載っている Wire.beginTransmission(device_address); Wire.write(control_reg); Wire.write(0x83); // ADC reset, wakeup, low gain, fixed time mode, 179.2ms Wire.endTransmission(false); Wire.beginTransmission(device_address); Wire.write(control_reg); //ADC start, wakeup, low gain, fixed time mode, 179.2ms Wire.write(0x03); Wire.endTransmission(true); //probably for RGB+IR delay(180*4); //total exposure time Wire.beginTransmission(device_address); Wire.write(0x03); Wire.endTransmission(false); Wire.requestFrom(0x2A,8,true); //read data colordata = Wire.read(); colordata <<= 8; colordata |= Wire.read(); red = colordata; colordata =0; colordata = Wire.read(); colordata <<= 8; colordata |= Wire.read(); green = colordata; colordata =0; colordata = Wire.read(); colordata <<= 8; colordata |= Wire.read(); blue = colordata; colordata =0; colordata = Wire.read(); colordata <<= 8; colordata |= Wire.read(); IR = colordata; return; } 上手く動いたが改善は都度していきたい。 *2014/4/26 OZVの使い方 [#q72fd410] -irone用。XBeeとあまり変わらないが、パケットを作成したりデータを取り出す必要がある。 -プログラム ~ -send側 ~ #include <SoftwareSerial.h> SoftwareSerial ozvSerial(10, 11); // RX, TX //send packet, for the last 3elements, length, data and check sum byte send[10]={0xFE, 0x05, 0x2A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //length of data int length = 0x01; //data int data = 0xCA; int i = 0; //loop void setup(){ Serial.begin(9600); ozvSerial.begin(38400); //complete send packet send[sizeof(send) - 3] = length; send[sizeof(send) - 2] = data; //culculate checksum and complete send command for(i = 1; i < sizeof(send) - 1; i++){ send[sizeof(send) - 1] = send[i] ^ send[sizeof(send) - 1]; } } void loop(){ //send delay(1000); ozvSerial.write(send,sizeof(send)); } -receive側 ~ #include <SoftwareSerial.h> SoftwareSerial ozvSerial(10, 11); // RX, TX // for the last 2elements, data and SUM //receive packet byte receive[12]; //data from received packet int getData = 0x00; //serial received data byte receivebyte = 0x00; int i = 0;//loop int count = 0;//insert data into receive array int start = 0;//start inserting int receiveLen = 12;//receive packet length is 12 void setup(){ Serial.begin(9600); ozvSerial.begin(38400); } void loop(){ //receive if(ozvSerial.available()){ receivebyte = ozvSerial.read(); //0xFE is start of a paket if(receivebyte == 0xFE){ start = 1; //other than 0xFE, 11elements remaining to receive }else if(start == 1 && count < receiveLen - 1){ receive[count] = receivebyte; count++; //when finished inserting, get data from the packet }else if(count == receiveLen - 1){ count = 0; start = 0; getData = receive[receiveLen - 3]; Serial.print("data = "); Serial.println(getData, HEX); } } } 詳しくは忘れたのでプログラムだけでも忘備録と *2014/1/10 追記 [#q314a404] -日本語のencodingは、%!TEX encoding = UTF-8 Unicodeの一文を.texファイルの最初10行以内に入れる *2014/1/10 TeXをMacにインストール・コマンドのパスを通す [#i29e5e51] -今更ながらマックにTeX環境を構築した。LaTeXも使えてpdfファイルも出力できたので、まとめ。 -sasadaさんの作業日誌をヒントに進めた→http://ifdl.ec.t.kanazawa-u.ac.jp/diary/index.php?sasada#b53f5bea -�.ぅ鵐好函璽襦�初期設定 ~ http://d.hatena.ne.jp/lucky_pool/20120209/1328758735 このサイトの手順に従う。~ 1. Drag & Drop UpTeX ~ 2. ESP Ghostscriptに加えて、~ 3. UpTeX差分ファイル ~ も、と別のところで書いてあったのでダウンロード。3については、解凍後のdvipdfmxファイルを ~ /Applications/UpTeX.app/teTeX/binにドラッグ&ドロップして全てのインストール完了。 ~ サイトに書いてある初期設定はしておく。 ~ さらに、アプリケーション内のTeXPadは、一度ダブルクリックで開いて初期設定をokと押しておく。 -�▲僖垢鯆未� ~ コマンドから直接コンパイルやdivファイルを作る際には、コマンド郡(?)にパスを通しておく必要がある。 ~ http://xn--p8ja5bwe1i.jp/wiki/%E3%81%9D%E3%81%AE%E4%BB%96/Mac%E3%81%A7%E3%83%91%E3%82%B9%E3%82%92%E9%80%9A%E3%81%99/ ~ この記事がとても参考になる。ただし、.bashrcの作成の仕方とPATHの前にexport付けるとかは書いてないので付け加え。 ~ https://gist.github.com/disktnk/4104284 上記2つの解決法が載っていた。 ~ さらに、編集の仕方と保存・終了の仕方は ~ http://www14.plala.or.jp/campus-note/vine_linux/operation/vi.html ~ 要するに、.bashrcを開いてiを押すと編集画面になり、コマンドモードに戻る時はescを押す。保存+終了はwqをコマンド入力する。 ~ ここまでが終わるとパスの確認をする。ターミナルに platex -v を入力してcommand not found以外のplatexに関する説明が出てきたらok ~ あとはチュートリアルhttp://www.comp.tmu.ac.jp/tsakai/lectures/intro_tex.htmlにあるコマンド入力 ~ platex sample.tex でエラーがなければdviファイルができて、 ~ dvipdfmx sample.dvi ~ でpdfファイルができる。 ~ *2013/12/8 RFM12B(微弱無線モジュール)を使ってみた [#y7e8e6c5] -先生に頂いたライブラリをいじってみた -未完成部分(電場強度の計算・irone用に完全arduino UNO抜きでの通信・通信距離測定) -完成部分(データの送信・受信) -SPI通信によって制御する。 �―猗�: データシート http://www.hoperf.com/upload/rf/rfm12b.pdf コマンド http://www.hoperf.com/upload/rf/rfm12b.pdf コマンド早見表 http://tools.jeelabs.org/rfm12b.html http://www.sevenwatt.com/main/ 電波強度 http://eleclog.quitsq.com/2011/11/rfm12b-radio-act.html Arduino cookbook https://www.inkling.com/read/arduino-cookbook-michael-margolis-2nd/chapter-14/recipe-14-6 パケット内容 http://lowpowerlab.com/blog/2012/12/28/rfm12b-arduino-library/#more-109 http://lowpowerlab.com/blog/2013/06/20/rfm69-library/ http://jeelabs.org/2011/12/11/inside-the-rf12-driver-part-2/ 2進数計算 http://hogehoge.tk/tool/number.html Arduinoピン配置 http://wiki.onakasuita.org/pukiwiki/?Arduino%2F%E3%83%94%E3%83%B3%E9%85%8D%E7%BD%AE ��回路: #ref(rfm_1.png) 今回はこれらに加えてnINT/VDI, FSK/DATA/nFFS, DCLK/CFIL/FFIT, nRESピンをマイコンと繋いだ。 Arduino UNOは5Vで動作するので、RFM12Bに入る信号を分圧する。どの信号が入るかはデータシートのDIを見ると分かる。 ��ライブラリ: -RF12.cpp /*useful command: http://tools.jeelabs.org/rfm12b.html arduinoを使用するときは16MHzになっているので/4(デフォルト)に加えて/2のに分圧して使う。(RFM12Bが 2.5MHzまでしか受け付けない設定のため) #define arduino 先生のライブラリから変更した箇所 */ #define changed /*commands*/ #define SET_TX 0x8279 #define SET_RX 0x82D9 #define RESET 0x0000 #define STATUS_CHECK 0x0000 #define TX_SEND 0xB800 //+ data #define RX_RECEIVE 0xB000 #define CONFIGURATION 0x80D7 // el(enable tx regigter), ef(enable FIFO) 12.0pF, 433MHz #define SET_FREQUENCY 0xA4B0 // 433MHz #define SET_DATARATE 0xC623 // 9.6kbps #define SET_PLL 0xCC17 // CLK=2.5MHz, !ddy ddit, PLL BW=256k #define RX_CONTROL 0x94C2 // VDI,FAST,67kHz,LNA=0dBm,RSSI=-91dBm #define Data_Filter_Clock_Recovery 0xC2AC // AL,!ml,DIG,DQD4 #define FIFO_RESET_MODE 0xCA83 // FIFO8,2byte-SYNC,!AL,ff,DR #define TX_CONTROL 0x9850 // !mp,90kHz,MAX OUT TXpower=0(max) #define AUTO_FREQUENCY_CONTROL 0xC483 // @PWR,NO RSTRIC,!st,!fi,OE,EN #define SET_WAKEUP_TIMER 0xE000 // wake up timer / NOT USE #define SET_LOW_DUTY_CYCLE 0xC800 // low duty cycle / NOT USE//status #define SET_LOW_BATTERY_DETECT_uC_CLK 0xC049 // 1.66MHz,3.1V #define SET_SYNC_PATTERN 0xCED4 // SYNC=2DD4 //status #define TX_READY 0x8000 #define FIFO_REACHED 0x8000 //pin #define SPI_MOSI 11 #define SPI_MISO 12 #define SPI_SCK 13 #include <pins_arduino.h> #include <avr/interrupt.h> #include <Arduino.h> #include <RF12.h> int nIRQ_pin, SS_pin, RST_pin; int mode; uint8_t RF12::spi_byte(uint8_t out) { SPDR = out; while (!(SPSR & _BV(SPIF))); return SPDR; } uint16_t RF12::xfer_byte(uint16_t cmd) { uint16_t dat = 0; digitalWrite(SS_pin, 0); dat = spi_byte(cmd >> 8) << 8; dat |= spi_byte(cmd); digitalWrite(SS_pin, 1); return(dat); } void RF12::send_byte(byte data) { uint16_t d; // while(!((d = xfer_byte(0x0000)) & 0x8000)) Serial.println(d, HEX); //send 0000(status check). when returned 8000 TX is ready while(!(xfer_byte(STATUS_CHECK) & TX_READY)); // wait for TX ready xfer_byte(TX_SEND + data); delay(1); } //sending 1bit per time //would I need this? void RF12::send_data(byte *data, byte len) { byte cksum = 0; for (int i = 0; i < len; i++){ send_byte(data[i]); cksum += data[i]; } send_byte(cksum); } //wait(blocks) until it receives -> it's okay cuz used only for speaker #ifdef changed byte RF12::receive_byte() { //interrupt request output(from RFM12B), active low while(digitalRead(nIRQ_pin) == 1); // wait for any data received //status check, reset functions //xfer_byte(0x0000); // while(!(xfer_byte(0x0000) & 0x8000))Serial.println(xfer_byte(0x0000), HEX); // wait for RX ready //read 8 bits from the receiver FIFO (even if FIFO not used it still shares the same pin with RX(pin6)) xfer_byte(RESET); return(xfer_byte(RX_RECEIVE)); } #else byte RF12::receive_byte() { //interrupt request output(from RFM12B), active low while(digitalRead(nIRQ_pin) == 1); // wait for any data received //status check, reset functions xfer_byte(0x0000); //read 8 bits from the receiver FIFO (even if FIFO not used it still shares the same pin with RX(pin6)) return(xfer_byte(0xB000)); } #endif //needed to recaive less than a byte? byte *RF12::receive_data(byte *data, byte len) { int i; for (i = 0; i < len; i++){ data[i] = receive_byte(); } return(data); } void RF12::begin(uint8_t nIRQ, uint8_t SS, uint8_t RST) { nIRQ_pin = nIRQ; SS_pin = SS; RST_pin = RST; pinMode(RST_pin, INPUT); // digitalWrite(RST_pin, 0); digitalWrite(SS_pin, 1); pinMode(SS_pin, OUTPUT); //digital 11,12,13 is fixed //faster when set it directly? #ifdef changed DDRB |= ((1<<DDB3)|(1<<DDB4)|(1<<DDB5)); #else pinMode(SPI_MOSI, OUTPUT); pinMode(SPI_MISO, INPUT); pinMode(SPI_SCK, OUTPUT); #endif //need to make this smaller than 2.5MHz? arduino is 16MHz SPCR = _BV(SPE) | _BV(MSTR); // SPI master enable, Mode0 #ifdef arduino SPSR |= _BV(SPI2X); #endif pinMode(nIRQ_pin, INPUT); digitalWrite(nIRQ_pin, 1); // pull-up, active low //status check for return and initialization xfer_byte(RESET); // intitial SPI transfer added to avoid power-up problem // wait until RFM12B is out of power-up reset, this takes several *seconds* //empty Tx buffer xfer_byte(TX_SEND); // in case we're still in OOK mode //reset again and again while (digitalRead(nIRQ_pin) == 0) xfer_byte(RESET); //yes, commands start //enable internal register and FIFO mode ---> why? needed for real time and 1 byte transmission? xfer_byte(CONFIGURATION); // el, ef 12.0pF, 433MHz //fastest way it might be: turning on the whole receiver chain, synthesizer, and oscillator //I don't understand here according to datasheet #ifdef changed xfer_byte(0x82d9); // RX mode -> in case didn't set the mode? xfer_byte(SET_FREQUENCY); // 433MHz xfer_byte(SET_DATARATE); // 9.6kbps xfer_byte(SET_PLL); // CLK=2.5MHz, !ddy ddit, PLL BW=256k //especially here //xfer_byte(TX_CONTROL); // !mp,90kHz,MAX OUT TXpower=0(max) xfer_byte(RX_CONTROL); // VDI,FAST,67kHz,LNA=0dBm,RSSI=-91dBm #else //receiver baseband circuite separately switched on xfer_byte(0x82d9); // RX mode -> in case didn't set the mode? xfer_byte(0xA640); // 437MHz (430+0.0025*(0x640)[MHz]) xfer_byte(0xC647); // 4.8kbps xfer_byte(0xCC77); // CLK=2.5MHz, !ddy ddit, PLL BW=256k xfer_byte(0x94A2); // VDI,FAST,134kHz,LNA=0dBm,RSSI=-91dBm #endif //Data Filter & Clock Recovery xfer_byte(Data_Filter_Clock_Recovery); // AL,!ml,DIG,DQD4 //FIFO and reset mode xfer_byte(FIFO_RESET_MODE); // FIFO8,2byte-SYNC,!AL,ff,DR //Automatic Frequency Control xfer_byte(AUTO_FREQUENCY_CONTROL); // @PWR,NO RSTRIC,!st,!fi,OE,EN //replaced---------------------------------------------------------------- //TX control xfer_byte(TX_CONTROL); // !mp,90kHz,MAX OUT TXpower=0(max) //------------------------------------------------------------------------ xfer_byte(SET_WAKEUP_TIMER); // wake up timer / NOT USE xfer_byte(SET_LOW_DUTY_CYCLE); // low duty cycle / NOT USE //Low Battery Detect and µC Clock xfer_byte(SET_LOW_BATTERY_DETECT_uC_CLK); // 1.66MHz,3.1V //Synchronization Pattern xfer_byte(SET_SYNC_PATTERN); // SYNC=2DD4 delay(1); } void RF12::set_tx_power(uint8_t pow) { //just setting the power on TX Configuration Command xfer_byte(TX_CONTROL + (pow & 0x07)); } uint16_t RF12::read_status(void) { return(xfer_byte(STATUS_CHECK)); } RF12::RF12(void) { } void RF12::set_mode(uint8_t md) { mode = md; // xfer_byte(0x8239); // !er, !ebb, et, es, ex, !eb, !ew, dc (for tx) // xfer_byte(0x82D9); // er, ebb, !et, es, ex, !eb, !ew, dc (for rx) //new------------------------------------------------------------------- //xfer_byte(0x8279); // !er, ebb, et, es, ex, !eb, !ew, dc (for tx) // xfer_byte(0x82D9); // er, ebb, !et, es, ex, !eb, !ew, dc (for rx) #ifdef changed if (md == RF12_MODE_TX) xfer_byte(SET_TX); else if (md == RF12_MODE_RX) xfer_byte(SET_RX); #else if (md == RF12_MODE_TX) xfer_byte(0x8239); else if (md == RF12_MODE_RX) xfer_byte(0x82d9); #endif } int RF12::available(void) { if (digitalRead(nIRQ_pin) == 0) return(1); else return(0); } -送受信のinoファイル Rx: #include <RF12.h> int RF12_SS = 10; int RF12_nIRQ = 9; int RF12_RST = 8; uint8_t payload[16]; uint16_t pckt; RF12 rf12 = RF12(); byte data; byte packet[16]; void setup() { Serial.begin(9600); rf12.begin(RF12_nIRQ, RF12_SS, RF12_RST); rf12.set_mode(RF12_MODE_RX); Serial.println("Ready Rx"); } int header = 4; int tail = 6; int index = 0, check = 0; void loop() { //uint8_t c; if (rf12.available()){ data = rf12.receive_byte(); if((data == 0xAA) || (data == 0x55)) ; else Serial.write(data); } //Serial.println(); } Tx: #include <RF12.h> int RF12_SS = 10; int RF12_nIRQ = 9; int RF12_RST = 8; uint16_t payload[16]; uint16_t c; RF12 rf12 = RF12(); void setup() { Serial.begin(9600); pinMode(4, OUTPUT); rf12.begin(RF12_nIRQ, RF12_SS, RF12_RST); rf12.set_mode(RF12_MODE_TX); Serial.println("TX ready"); c = '!'; } void loop() { //packet format - only activating necessary parts for just 1 byte transmission //see http://jeelabs.org/2011/12/11/inside-the-rf12-driver-part-2/ //or http://lowpowerlab.com/blog/2012/12/28/rfm12b-arduino-library/#more-109 //for full packet information //necessary part(5 bytes) //preamble rf12.send_byte(0xAA); rf12.send_byte(0xAA); rf12.send_byte(0xAA); //SYN-ox2d rf12.send_byte(0x2D); //SYN-network ID (network group (can be in the range 1-255) -> 212) rf12.send_byte(0xD4); //header //CTLflag + DestID(unique node ID of receiver (1 through 30) -> 85) //0 + 55 //rf12.send_byte(c); rf12.send_byte(0x55); //ACK + SourceID(unique node ID of receiver (1 through 30)) //1 + 42? rf12.send_byte(0xaa); //DataLength rf12.send_byte(0x55); //Data rf12.send_byte(0xaa); rf12.send_byte(c); //CRC rf12.send_byte(c+1); rf12.send_byte(c+2); rf12.send_byte(0x55); //CRC rf12.send_byte(0xaa); rf12.send_byte(0x55); rf12.send_byte(0xaa); rf12.send_byte(0xaa); rf12.send_byte(0xaa); //Serial.println("Sent."); digitalWrite(4, HIGH); delay(250); digitalWrite(4, LOW); delay(250); //} } 注意:Serial.printを使うとSerialがハイになっている時に何故か0を読む。するとビットがずれて値がおかしくなるのでSerial.writeを使う方が良かった。(1byteの通信はこちらの方がいいということも書いてあった) 100回に1回ぐらい値を間違えることがある。 上記プログラムの細かい内容については後ほど更新予定 *2013/12/8 Serial.printとSerial.write [#hdc93cf4] -参考: http://arduino.cc/en/Serial/write 1byteあるいはそれ以上のバイト単位毎に、Serial.writeはバイナリーデータそのままをシリアルポートに送るらしい。→1byte毎のデータ通信にはwriteの方がいいのかも *2013/9/30 unsignedに気をつける [#m66236ad] -ただのintで-がつくのは値が大きい場合 *2013/9/26 ATmega3238Pブートローダ後のスケッチ書き込みメモ [#q6db51f1] -リセットスイッチにつけるコンデンサは0.1μFだと上手くいくけれども22pFだと書き込みできない(容量が小さすぎて上手くリセットされていないのかも?) * 2013/9/24 ATmega328Pのブートローダー書き込みメモ(PU) [#p9c3868b] -ヒューズ設定表 #ref(3_1.png) -どのブートローダーを使うかはbootloader.txtに載っている -ATmega328pではhttp://ifdl.ec.t.kanazawa-u.ac.jp/~akita/lt/index.php?Hardware%2FLED_Tile%2F328 #ref(3_2.png) -手順(巨匠さんの作業日誌も参考にさせて頂きました。) -図がたくさんで分かりやすい、、、 -http://mizupc8.bio.mie-u.ac.jp/pukiwiki/index.php?Arduino%2F%E8%87%AA%E4%BD%9C * 2013/9/23 忘備録-Sparkfun.com MP3 Player Shieldを使う時のチュートリアル指定ファイルが存在しない [#s4a9511f] -Sparkfun.com MP3 Player ShieldをUNOで使う時にインストールするライブラリのピン(SSを10→9)に変更しないといけない。 -https://www.sparkfun.com/tutorials/295 の #ref(2_1.png) が存在しないのですが、Arduino/libraries/SdFat/SdFatConfig.hの一番下 #ref(2_2.png) にありました。ここのCSを10→9に変えると動きました。 * Eclipseを使ってJavaでシリアル通信 [#ga87d6a8] - 動作環境:Windows7 64bit - 手順 �.轡螢▲訥命�を行いたいEclipseのpackage下に追加ライブラリ用のフォルダを作る(名前は何でもいいけど写真ではlib) #ref(1.png) ��追加用のライブラリをインストール -- http://mfizz.com/oss/rxtx-for-java このフォルダを解凍した中の、 rxtxParallel.dll rxtxSerial.dll RXTXcomm.jar をコピーして、�,離侫�ルダ内にペースト -もしもパソコン自体にインストールしたい場合は、Program Files内のJavaファイルのライブラリに入れる(やってないので動くかは不明) ��EclipseでLibrary Pathを追加する -Eclipseを起動 -まず、新しく作ったフォルダが入っているPackage名を右クリックして、Refreshを選択。(または、Package名を選択後、F5を押す。) これで、新フォルダがPackageに仲間入り。 -ProjectタブのPropertiesをクリックする。Propertiesの左にJava Build Pathがあるのでクリック。 -Librariesタブをクリック。Add Jars...をクリックして、�,悩遒辰織侫�ルダ内のRXTXcomm.jarを選択。 #ref(2.png) -これで設定は完了。あとはプログラムを書くのみ。 �ぅ廛蹈哀薀犧鄒� -CommLight.java(メインがあるファイル) //port check //JDK check import java.io.*; public class CommLight{ static File sharedText; public static void main(String[] args){ SerialComm serialcomm = new SerialComm(); serialcomm.open(); int i = 10; while(i>0){ serialcomm.write((byte)0x34); try{ Thread.sleep(500); }catch(Exception e){ } serialcomm.write((byte)0x20); try{ Thread.sleep(500); }catch(Exception e){ } serialcomm.write((byte)0x78); try{ Thread.sleep(500); }catch(Exception e){ } i--; } System.out.println("Hello, World"); } } -SerialComm.java import gnu.io.*; import java.io.*; import java.util.*; public class SerialComm implements SerialPortEventListener{ private SerialPort port; // private static BufferedReader reader; private InputStream in; private OutputStream out; SerialComm(){ super(); } public void open(){ try { // Serial port initialize CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM6"); port = (SerialPort)portId.open("USB Serial Port", 2000); port.setSerialPortParams( 9600, // í êMë¨ìx[bps] SerialPort.DATABITS_8, // ÉfÅ[É^ÉrÉbÉgêî SerialPort.STOPBITS_1, // ÉXÉgÉbÉvÉrÉbÉg SerialPort.PARITY_NONE // ÉpÉäÉeÉB ); port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); try{ port.addEventListener(this); port.notifyOnDataAvailable(true); in = port.getInputStream(); out = port.getOutputStream(); }catch(TooManyListenersException ex){ System.out.println("Error1: "+ex); } } catch (Exception e) { System.out.println("Error2: " + e); System.exit(1); } } public void close(){ try{ in.close(); out.close(); port.close(); }catch(Exception e){ System.out.println("close: "+e); } } public void read(){ try{ byte[] buffer; int temp = in.available(); if(temp>0){ System.out.println("temp: "+temp); buffer = new byte[temp]; temp = in.read(buffer); int num = 0; while(num<temp){ System.out.println("b "+num+": "+Integer.toHexString((byte)buffer[num])); num++; } } in.close(); }catch(Exception e){ System.out.println("error4: "+e); } } public static String toHex(byte[] digest) { StringBuilder sb = new StringBuilder(); for (byte b : digest) { sb.append(String.format("%1$02X", b)); } return sb.toString(); } public void write(byte data){ try{ out.write((byte)data); out.flush(); //ÉXÉgÉäÅ[ÉÄÇ∆COMÉ|Å[ÉgÇï¬Ç∂ÇÈèàóù }catch(Exception e){ System.out.println("port exception: "+e); } } public void run() { try { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); OutputStream out = port.getOutputStream(); boolean flagQuit = false; while (!flagQuit) { String input = br.readLine(); if (input.length() > 0) { if (input.equals(":quit")) break; input += "\r"; out.write(input.getBytes("US-ASCII")); } } port.close(); } catch (Exception e) { System.out.println("Error3: " + e); } } public void serialEvent(SerialPortEvent event) { if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { read(); } } } �ゴ粟�