フォト
2025年3月
            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          
無料ブログはココログ

« 2014年2月 | トップページ | 2014年4月 »

2014年3月の9件の記事

2014年3月29日 (土)

個人的にデフレスパイラル脱出?

確定申告の還付金が振り込まれたので、
ちょっとだけいいハンダごてを購入しました。温度調整機能付きです。
(左が新ハンダごて、右がニクロム線ヒーターの安いハンダごて)

Dscn2537

ニッパーもついでに購入。
左が購入したニッパー、右はダイソーの100円ニッパー。

Dscn2536

単純なニッパーでも使ってみると、使い心地が全然違います。
うーん、なんでこんな使いにくい100均製品を使っていたのだろう。

ちょとしみじみと考えてしまいました。
良い物はそれなりの値がしますがその分、効率や精度等が全然違います。
日常的に使うのであれば道具はこだわらないといけませんねぇ。

長年日本経済のデフレスパイラルと同様に「より安い物、安い物」との思考で
物を購入する思考に陥っていましたが、効率面等を含めてトータルで考えると
「安い=損」の場合もありそうです。

2014年3月28日 (金)

超音波距離センサーHC-SR04を使った距離測定器の製作

以前購入して放置していた超音波距離センサーモジュール HC-SR04を使って
実用として使える(?)簡易距離測定器を製作しました。

Dscn2165

上の写真がHC-SR04です。使い方は簡単でスイッチサイエンスさん商品紹介ページ
原理とサンプルソースが掲載されています。

製作

まずはArduino UNOでプロトタイプを作成し動作確認後にATmega328に
置き換えました。測定結果は4桁7セグLEDで表示させます。

Arduino IDEでATmega328のプログラミングを行う環境は、
kosakalabさんのHP「Arduino IDEでATtiny他の開発(AVRISP編)」の記事を
参考にしました。ただし書込みはUSBaspを使ってます。

Dscn2515

回路的にはこんな感じです。

01

4桁7セグLEDとMAX7219のピン割り付け

02

これを基板に実装してモジュール化しました。
4桁7セグとCPUは別々にモジュールして別のものに利用出来るように工夫してみました。

4桁7セグはMAX7219を使って3本の信号線と電源2本で接続します。

Dscn2526

CPUモジュールは、こんな感じでピン端子、ISP端子、電源端子を付けただけです。
内部クロック8MHzで利用します。

Dscn2527

プログラムの書き込みはこんな感じでUSBaspをつなげてやります。

Dscn2529

これらをつなげて動作確認後、

Dscn2522

強引にケースに詰め込んで完成しました。

Dscn2520

Dscn2519

う~ん、ダサい。もっとかっこよいデジタルアイテムをイメージしたのですが...

ケースのスイッチ類は電源ボタンと測定ボタン(プッシュボタン)です。
測定ボタンを長押しすることで、リアルタイム計測とワンショット計測の切り替えが
出来ます。ワンショット計測時は測定ボタンを押す都度計測します。

そこそこの精度は出ます。測定範囲は2cm~400cm位です。
取りあえず、ケースは作り直します。

プログラムはこんな感じです。

#include "LedControl.h"


#define trigPin 8
#define echoPin 9
#define swPin   5

#define DISP_ERROR      -3    // 測定エラー
#define DISP_MODE_LOOP  -2    // リアルタイム計測モード表示
#define DISP_MODE_ONE   -1    // ワンショット計測モード表示

boolean flgRealTime = false;  // リアルタイム測定モードフラグ
                              // 初期状態はワンショット計測モード

// LED7セグ表示用
LedControl lc=LedControl(2,4,3,1);  // DIN,CLK,LOAD

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(swPin, INPUT_PULLUP);
  
  lc.shutdown(0,false);
  lc.setIntensity(0,10);
  lc.setScanLimit(0,3);
  lc.clearDisplay(0);

  dispLed(DISP_MODE_ONE);  
}

// LED7セグに数値表示
void dispLed(float val) {
  char str[10];
  byte clm =0;
  byte digit = 0;
  boolean flgdp = false; 
  byte i=0;
  char v;

  if (val == DISP_MODE_LOOP) {
    lc.setChar(0,0,'L',false);
    lc.setChar(0,1,'0',false);
    lc.setChar(0,2,'0',false);
    lc.setChar(0,3,'P',false);  
    return;
  }
  if (val == DISP_MODE_ONE) {
    lc.setChar(0,0,'-',false);
    lc.setChar(0,1,'-',false);
    lc.setChar(0,2,'-',false);
    lc.setChar(0,3,'-',false);  
    return;
  }  
  if (val == DISP_ERROR) {
    lc.setChar(0,0,' ',false);
    lc.setChar(0,1,' ',false);
    lc.setChar(0,2,' ',false);
    lc.setChar(0,3,'E',true);  
    return;
  }  
  
  val = val+0.05;   
  int  v1 = val;
  int  v2 = val*10 - v1*10;
  
  sprintf(str,"%3d.%1d",v1,v2);
  while(true) {
    if (str[i] == '\0') {
      break;
    }
    v = str[i];
    if (str[i+1] == '.') {
      flgdp = true;
      i++;
    } else {
      flgdp = false;
    }
    lc.setChar(0,clm,v,flgdp);
    i++;
    clm++;
  }   
}  

// 距離の計測
void getDistance() {
  float duration,distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(2);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 500 || distance <= 0){
    dispLed(DISP_ERROR);    
  }
  else {
    dispLed(distance);
  }
}

void loop() {
  boolean sw;
  if (flgRealTime) {
    // リアルタイム計測表示
    getDistance();  
    delay(500);
  }
  
  // スイッチボタンの操作
  if (digitalRead(swPin) == LOW ) { 
    sw = true;
    // 3秒間押しっぱなしチェック
    for (int i= 0; i < 30;i++) {
      if (digitalRead(swPin) == HIGH) {
        sw = false;
        break;
      }
      delay(100);
    }      
    if (sw) {
      // 3秒間押したままならモードを変更する
      flgRealTime = (flgRealTime == true) ? false:true;      
      if (flgRealTime) {
        // リアルタイム計測モードに移行
        dispLed(DISP_MODE_LOOP);
      } else {
        // ワンショット計測モードに移行
        dispLed(DISP_MODE_ONE);
      } 
      while(digitalRead(swPin) == LOW);
    } else {
      if (flgRealTime == false) {
        // ワンショット計測           
        getDistance(); 
      }
    }
  }
  delay(100);
}

2014年3月27日 (木)

OCN モバイル ONEが値下げ&通信容量拡大

4月1日から全コースの一斉値下げと日次コースの通信容量の拡大だそうです。
http://www.ntt.com/release/monthNEWS/detail/20140320_2.html

01

現在OCNモバイルONE 30M/日コースにSIMカードを1枚追加して利用していますが、
容量が50MBに増えたのは大変うれしいです。

月当たり 50MBx30日 = 1500MB/月 が制限無しで使えることになりますね。

かなりお得な感じです。他社は追随出来ないんじゃないかなぁ。

2014年3月19日 (水)

最近のNHK語学番組は学習環境が充実しています

最近、私的に英語を使う機会(海外ネット通販、技術資料参照)が多くなり、
日常英語を勉強したいと思い、取りあえずラジオ英会話のテキストを購入しました。

Dscn2507

4月から新年度ということで、ちょうど良い節目なのでやろうと決意しました。
ただし、毎日15分放送をラジオに張り付いて聞くのはちょっと無理っぽい。

そこで、録音機能付きのラジオでも購入しようかと調べていたのですが、
それは不要となりました。

なんと、今時はストリーミング配信で聞きたいときに聞けるんですね。
全く知りませでした。

02_2

専用のホームページもあり使いやすくなってます。
「マイ語学」というサポート機能がありアカウントを作成すると学習記録を管理できるようです。

01

03_2

さらに、「ゴガクル」いう関連イーラニングシステムが無料で利用できます
(要別途アカウント作成)。

04

うーん、こんな充実した教材を提供しているとは全く知りませんでした。
使わないと損な感じすらします。

大昔、私が基礎英語なんかを聞いていた頃とは全然違いますね。

ただやはり、布団の中で寝る前に勉強したいと思いmp3形式でストリーミング配信を
録音したい。

ストリーミング配信をダウンロードできるフリーソフトを調べてみると
もう、ストライク的なソフトがありました。
「CaptureStream」かなり良いです。Windows版の他にMac、Ubuntu版もあります。

05

講座を選択して「ダウロード」ボタンを押すだけで当月放送済の放送をダウンロード
できます。

06

これはお手軽で良いです。製作者さんに感謝です。

ただし、Windows 8.1では現時点最新版のCaptureStream-Windows-2013-0819-2.zip
はストリーミング配信のダウンロードに失敗します。
前のバージョンのCaptureStream-Windows-2013-0803.zip なら正常にダウンロード
できました。この点については「Thread: Win8.1にアップグレードしたら」に情報があります。

2014/03/31 追記
3月31日にNHKの語学関係のホームページがリニューアルされました。
この影響かCaptureStreamが使えなくなりました。

2014/04/07 追記
CaptureStreamのアップデート版がいくつか公開されました。
その中でCaptureStreamQt5-Windows-20140404.zip (Date: 2014-04-04, Size: 31.9 MB)
がWindows 8.1 でもストリーミングのダウンロードが出来ました。
最新版のCaptureStream-Windows-20140407.zip (Date: 2014-04-07, Size: 18.4 MB)
ではエラーとなってだめでした。

NHK語学講座の関連リンク
 ・NHK語学番組 :http://www.nhk.or.jp/gogaku/
 ・みんなで学ぶNHK語学フレーズ ゴゴクル http://gogakuru.com/
 ・NHKラジオ語学講座ダウンロードツール CaptureStream
       http://sourceforge.jp/projects/capturestream/

2014年3月16日 (日)

ArduinoでSPIシリアルフラッシュメモリW25Q64を使ってみる(1)

Arduinoで容量の大きい外付けメモリを使いたいと思い、色々と調べて
SPI接続の8Mバイトのフラッシュメモリが使えるそうなので試してみました。

試した製品は、WINBOND製のW25Q64BVAIGという製品です。
パソコンのBIOSにも使われている製品のようです。

結論を先に言うと使えます。これはいいですよ。
8Mバイトも容量があると、グラフィックLCDでサイズ違いの日本語フォントが
同時に使えますね。

今回試した製品ですが、こんか感じです。

Dscn2484

8ピンDIP形式 3.3V駆動のSPIバス接続のフラッシュメモリです。
いつものごとくAliexpressで購入しました。10個で送料込みで$12.5でした。

3.3Vなので通常のArduinoでの利用はレベルシフタ等が必要ですが、私のUNOは
3.3Vも利用できるので問題なしです。

回路はこんな感じでシンプルです。

Dscn2481

01

さて、このメモリを使うプログラムですが、Arduinoで使っているサンプルがどこにも
ありません。仕方がないのでデータシートを見て自作しました。

フラッシュメモリはEEPROMと違いちょっと操作が面倒です。
ブロック、セクター、ページ等の単位出てきます。書込みがちょっと厄介です。

作成途中ですが取りあえず動いたので、公開します。
ここからダウンロードできます。指定セクタ内の任意アドレスにデータを書き込めます。
読込はリニアなアドレス指定で参照できます。

ダウンロード W25Q64.ino (11.7K)

シリアルモニタで動作確認をするとこんな感じです。

03



2016/05/23 追記

GitHubにてライブラリを公開しました。
https://github.com/Tamakichi/Arduino-W25Q64



2014年3月13日 (木)

arduinoで安価にテレビに映像を出力する

arduinoでテレビに安価に映像出力ができるらしいのでやってみました。
arduino-tvoutというライブラリとサンプルソースを利用しました。

01

まずはホームページの掲載の配線を行います。

Dscn2469

配線は3線の接続のみです。
パーツは抵抗2つ(1KΩ、470Ω)とビデオコンポーネントケーブル1本のシンプルな構成です。
手持ちに470Ωが無かったので510Ωを使いました。
余っている部品で作成できました。

2016/03/20 追記

1kΩの抵抗3本と余ったAVケーブルを使って安価にケーブル作れます。

02

Dscn5017

AVケーブルの片方を切って、リード線2本にこんな感じでつなげます。
リード線のGNDとコンポジット信号はテスターで確認した方が用でしょう。

Dscn5022

Arduinoにはこんな感じでつなげます。

Dscn5024

お試し程度ならこれでこれで十分です。

ホームページからライブラリTVoutBeta1.zipをダウンロードして解凍し、
arduinoのlibraryに配置します。

arduino IDEを起動し、メニュー[ファイル] のスケッチの例からTVoutを選択し、
サンプルソースを開きます。

サンプルプログラムをインストールし、モニタにビデオコンポーネントケーブルを
接続してみるとあっけなく映像が映りました。

Dscn2470

単色のみですが、想像以上にまともに表示されました。
これはすごい、ちょっと感動しました。

Dscn2479

解像度は128x96ドットですが、十分実用的です。

Yotubeにサンプル動画が公開されています。

ライブラリを見ると、文字の表示や図形の描画等の関数が用意されており、
かなりのことが出来そうです。

文字は英数字のみですが、ソースをみたところ比較的簡単に美咲フォントによる
漢字表示なんかもできそうです。ちょっといじってみようかな

=> 2016/03/20 追記
        実際にやってみました。詳細は下記の記事を参照
        Arduino用美咲フォントライブラリを作成しました(2)

      

2014年3月12日 (水)

Arduinoで美咲フォントを使った8x8ドットマトリクスLED(4)

8x8ドットマトリックスLEDを使った表示器作成の続きです。
ブレッドボードからユニバーサル基板に移行しました。かなり小型化できました。

一応、電池で稼働できます。
最終的にはサイコロのような立方体のオブジェにしたいと考えてますが、
これを作るだけで苦戦しました。

Dscn2452

2階建て構造です。パーツ的には、
 ・Arduino Pro Mini 328 5V 16MHz(互換機)
  ・8x8ドットマトリックス LED
  ・LEDディスプレイドライバ MAX7219
  ・1Mbit シリアルEEPROM AT24C1024B (美咲フォントを乗せるため)
  ・リアルタイムクロックIC DS1307
  ・水晶発振子 32.768KHz (リアルタイムクロック用)
  ・ボタン電池 CR1220 3V (リアルタイムクロック用)
 ・デジタル温度センサー DS18B20+
  ・単5電池ボックス
  ・単5電池
です。

裏はこんな感じです。もっときれいなはんだ付けが出来ないものだろうか。

Dscn2455

電池は外付け状態です。なんとか収納しようと単5電池にしたのですが、
今回はあきらめました。赤い基板はDC-DCコンバーターです。3Vを5Vに変換しています。

Dscn2462

消費電流を測定すると10mA程度でした。思ったほど喰わないです。
アルカリ単5電池 1本が900mAhあるそうなので、意外と長時間稼働できそうです。

実際の動作はこんな感じです。

まだまだ、ソフト面が全然だめです。
現状、時刻合わせやメッセージ変更のたびにプログラムを書き込む必要があるので、
何とかメンテナンス用ソフトを作って簡単に変更できるようにしたいです。

追記
ケースを作成して収納するとちょっとかっこよくなりました。
発砲スチロールボードにコルクシートを張り付けただけですが...

Dscn2572

動作はこんな感じ。
まだソフトウェアの製作の進捗が50%くらいです。ちびちびと作成中。

ゴールデンウイーク中に時間を取って完成させたい。


2014年3月 4日 (火)

日本語フォントROM GT20L16J1Y Breakoutを試してみました

スイッチサイエンスさんでarduinoで使えそうな日本語フォントROMが販売されていたので、
購入して試してみました。

製品:日本語フォントROM GT20L16J1Y Breakout

16x16日本語フォント(JIS208) ROM
3.3V動作
SPIアクセス

販売サイトおよび委託者さんのホームページにデータシートがあるのですが、
資料的に不十分です。フォントデータの取り出し方法が分かりません。
こちらのデータシートを参考にした方が良いでしょう。ただし中国語です。

本製品の情報があまりないのですが、SE組込人さんのホームページが大変参考に
なりました。参考記事:  漢字フォントROM(GT20L16J1Y)

動作電圧が3.3Vなのですが、幸いにして私のArduino UNO互換機は3.3Vモードがあるので
単純な配線で利用できました。

Dscn2441

取りあえずフォントデータの取り出しはできました。

01

フォントデータの格納形式がちょっと特殊です(データシートより抜粋)。
(B0がMSB、B7がLSBです)
03

フォントの格納アドレス
02

  "起始地址"はROM内の格納アドレスです。

電子回路の掲載を省略します。
通常のArduinoでは3.3Vのレベル変換する必要があります。

ソースはこんな感じです。

修正 2014/03/05
変数の型の定義が間違っており、一部のフォントが正しく表示できませんでした。
ソースファイルを修正しました。

修正前
  byte MSB;
  byte LSB;
修正後
  unsigned long MSB;   
  unsigned long LSB;

また、calcAddr()関数中で計算するオフセット値は138463ではなく138464が
正しいと思われるので修正しました。サンプルのミスだと思われます。

#include <SPI.h> 
#include <string.h> 
#define ASC8x16S 255968  // 8x16 ASCII 粗体字符(半角)
#define ASC8x16N 257504  // 8x16 ASCII 日文假名(半角)
 
byte rowdata[32];

// 全角JISコードからフォント格納先頭アドレスを求める
//   GT20L16J1Y データシート VER 4.0 2013-3のサンプルを参照した
//   (サンプルでは区点コードからの変換であることに注意)
unsigned long calcAddr(unsigned short jiscode) {
  unsigned long MSB;   
  unsigned long LSB;
  unsigned long Address;

  // 上位、下位を区点コードに変換
  MSB = (jiscode >> 8) - 0x20;
  LSB = (jiscode & 0xff) -0x20;
  
  // データ格納アドレスを求める
  if(MSB >=1 && MSB <= 15 && LSB >=1 && LSB <= 94)
    Address =( (MSB - 1) * 94 + (LSB - 01))*32;
  else if(MSB >=16 && MSB <= 47 && LSB >=1 && LSB <= 94)
    Address =( (MSB - 16) * 94 + (LSB - 1))*32+43584;
  else if(MSB >=48 && MSB <=84 && LSB >=1 && LSB <= 94)
    Address = ((MSB - 48) * 94 + (LSB - 1))*32+ 138464;
  else if(MSB ==85 && LSB >=0x01 && LSB <= 94)
    Address = ((MSB - 85) * 94 + (LSB - 1))*32+ 246944;
  else if(MSB >=88 && MSB <=89 && LSB >=1 && LSB <= 94)
    Address = ((MSB - 88) * 94 + (LSB - 1))*32+ 249952;
  
  return Address;
}

// JISコードからキャラクタデータを得る
void getCharData(unsigned short code) {
    byte data;
    unsigned long addr=0;
    byte n;
 
    if (code > 0xFF) {
      // 全角
      addr =calcAddr(code);
      n = 32;
    } else {
      // 半角
      addr = ASC8x16S + (code*16);
      n = 16;
    }
    
    digitalWrite(10, HIGH);
    delayMicroseconds(10);   
    digitalWrite(10, LOW);
    SPI.transfer(0x03);
    SPI.transfer((addr>>16) & 0xff);
    SPI.transfer((addr>>8) & 0xff);
    SPI.transfer(addr & 0xff);
    SPI.setBitOrder(LSBFIRST);
    
    for(byte i = 0;i< n; i++)  {
      rowdata[i] = SPI.transfer(0x00);
      delay(10);
    }
    SPI.setBitOrder(MSBFIRST);
    digitalWrite(10, HIGH);
}

void displayChar(unsigned short code) {

 getCharData(code);
 
 if (code > 0xff) { 
  for (byte y = 0; y <8; y++) {
    for (byte x = 0; x < 16; x++) {
      if (rowdata[x] & (0x80>>y)) {
          Serial.print("#");
      } else {
          Serial.print(".");
      }
    }
    Serial.println("");    
  }
  
  for (byte y = 0; y <8; y++) {
    for (byte x = 16; x < 32; x++) {
      if (rowdata[x] & (0x80>>y)) {
          Serial.print("#");
      } else {
          Serial.print(".");
      }
    }
    Serial.println("");    
  } 
 } else {
  for (byte y = 0; y <8; y++) {
    for (byte x = 0; x < 8; x++) {
      if (rowdata[x] & (0x80>>y)) {
          Serial.print("#");
      } else {
          Serial.print(".");
      }
    }
    Serial.println("");    
  }
  
  for (byte y = 0; y <8; y++) {
    for (byte x = 8; x < 16; x++) {
      if (rowdata[x] & (0x80>>y)) {
          Serial.print("#");
      } else {
          Serial.print(".");
      }
    }
    Serial.println("");    
  }  
 }  
}
   
void setup() {
 pinMode(10,OUTPUT);
 SPI.begin();
 Serial.begin(19200);  
   displayChar(0x41);
   displayChar(0x2422);
   displayChar(0x3a6b);
   displayChar(0x364c);
}

void loop() {
}

本製品、良いのですがarduinoで使う場合はちょっと不便です。
arduinoは文字のコード系にunucodeを使っているので、JISコードへの変換が必要と
なります。スケッチ上では文字を16進数で指定しないとダメです。

unucodeからJISコードへの変換には1対1対応のテーブルが必要です。
テーブルだけで32Kバイトの容量となります。
まあ、パソコンから直接データを送り込むような利用では使えそうです。

unicodeで格納されていればなぁと、類似品を調べると GT20L16P1YというROMも
あるようです。データシートはここ。日本も使えるはは不明ですが..

04
Aliexpressで入手可能のようですが、5個で$8.84。試して見ようかと思ったのですが、
今回はやめます。

2014/03/05 追記
本漢字ROMの全角JIS0208のデータは次のフォントを詰めて格納しているようです。
(区、点)であらわすとこんな感じで格納されています。

  (01,01)  - (15,46)   1362文字(#0       -  #1361) が連続で格納
  (16,01)  - (47,51)   2965文字 (#1362  -  #4326) が連続で格納
  (48,01)  - (84,06)   3390文字 (#4327  -  #7716) が連続で格納
  (85,01)  - (85,94)      94文字 (#7717  -  #7810) が連続で格納
  (88,01)  - (89,86)     180文字 (#7811 -  #7990) が連続で格納

 ここで#数字は先頭からの通番です。全角16x16は#0 - #7990の7991文字があります。
  (資料では7999文字ですが、8文字足りない?)
  それぞれの区の格納先頭アドレスは通番先頭に32を掛けた値になります。
 
 サンプルソースの関数calcAddr()ではこの割り付けを元に計算できます。

  ちなみに区点コードとJISコードの関係は
  区コード = JISコード上位1バイト - 0x20
  点コード = JISコード下位1バイト - 0x20
  例: 埼:JISコード: 3A6B  区点コード: (26, 75) =  (0x1A, 0x4B) = (0x3A-0x20, 0x6B-0x20) 

2014年3月 2日 (日)

arduinoがシリアル通信時にリセットされる原因が分かりました

ここ数日、Arduinoとパソコン間でシリアル通信を行う際に
   1)初期通信が不安定
  2)Arduinoにリセットがかかる
の件で悩んでいました。

これが解決できないと、arduinoを連続稼働したままでパソコンとのシリアル通信が
出来ないし、通信でエラーが発生します。

パソコン側はLinux (CentOS)で通信ソフトを作成していたのですが、
操作性の良いWindows環境に作り変えることにし、その際Arduinoの仕様を
見直したところ、本家arduino.ccのホームページのArduino UNOの仕様において
に「Automatic (Software) Reset」なる記事を見つけました。
(ヒントはeggshell blueさんHP「DTR と Arduino の関係」から頂きました:感謝!)

結論及び仕様の要点をいうと
Arduino UNOにおいてUSB経由でシリアル通信する際、DTR端子の状態がLOWの
場合はリセットがかかり、HIGHの場合はリセットがかからないです。

この仕様はArduino IDEからのソフトウェア書き込み&再起動のための仕様でです。

今回、パソコン側の通信ソフトをVisual Basic 2013で作り直しました。
シリアル通信はSerialPortというモジュールを使いました。
このモジュールのプロパティにDtrEnableという項目があり、DTRの利用の指定ができます。

DtrEnableをFlaseに設定することで、USB経由でのシリアル通信開始時に
リセットが発生せず、安定した通信ができました。

これでarduinoとのシリアル通信は自分が意図するイメージで行えるようになりました。
Arduino接続の外部EEPROMの書き込みソフトが完成しました。

Visual Basic 2013で作成したアプリはこんな感じです。
データファイルを指定して任意のアドレスにデータを書き込みます。

03

データが正しく書き込めたかのチェックは2バイトのチェックサムを比較しています。
書込みはスレッドにてバックグラウンドで行い、進捗表示、中断ができます。

スレットからUI関連のAPIを使うとエラーとなることにちょっとハマりましたが、
こんな感じで
                Me.BeginInvoke( _
                Sub()
                    Lbl_status.Text = "状況: 通信中 [" & cnt & "/" & data.Length & "]"
                    Lbl_status.Update()
                End Sub)

Invokeを使うことで解決できました。

VBのソース ダウンロード EEPROMWrite.zip (178.0K)

arduino側はシリアル通信においてはスレーブ動作でパソコンから受信したコマンド
に応じて処理を行います。TeraTerm等で対話的にデータの参照もできます。
arduino UNO用のソース  ダウンロード download.zip (3.1K)


arduinoにTeraTermで接続し"i"と入力するとI2Cバス接続デバイスのアドレスを表示
04

"p10000,100FFF"と入力してEEPROMの指定範囲のデータを表示
05

Visual Basicでのプログラミングは久しぶりですが、シリアル通信のSerialPort
は使いやすくで良いです。以後ツールはVisual Basicで作成します。
開発環境も無料ですし。作成も1日程度でできました。



« 2014年2月 | トップページ | 2014年4月 »