はにゃぶろぐ はじめました

物欲情報とかTipsとかいろいろ載せていけたらいいなぁ

Intel Galileo / Arduino IDE 1.5.3 の EthernetUDP クラスで remoteIP(), remotePort() を有効にする対策

Intel GalileoLinuxの上に Arduino互換を実現しているのですが、
Arduino IDEの上でコンパイルしているものが、実は互換ライブラリとスタブをリンクしたLinuxアプリケーションという素敵仕様なのです。

ですから、Arduinoスケッチに見せかけて libcもほかのシステムコールでも使えます。

それを前提として、表題の問題を解決しましょう。

なお、現在配布されている Galileo用のArduino-1.5.3については動作を確認しています。

課題

そもそも、Galileo への portingで問題となってるのは、UDPパケットを受信するアプリケーションを作成した場合に、
送信元IPアドレス, 送信元ポート番号が取得できないということです。

原因はとても簡単な話で、Arduinoのシールドでは
parsePacket()すると、read()する前にヘッダを覗いて 内部メンバ変数を書き換えていますが、
socketインターフェイスを使って実装した Galileo でトリッキーな芸当はできなかったのです。

対策

parsePacket() で内部メンバを初期化して、read(unsigned char* buffer, size_t len)を呼び出した際に
recvfrom関数を使ってますが、ここで sockaddr_in 構造体を渡して書き込んでもらい、内部メンバを設定しただけです。

なにせ socket インターフェイスの話ですから、普通のunixアプリケーションだと思って考えるだけでいいわけですが、
read()でしか判定できないし、portingされた parsePacket() の処理内容は替えたくないので、

使用するコード側で、
parsePacket() と
read(unsigned char* buffer, size_t len) を呼び出した後で、
EthernetUDP::remoteIP(), remotePort() を呼び出してください。
そうすれば読み取れます。

修正すべきソース

arduino-1.5.3/hardware/arduino/libraries/Ethernet/EthernetUDP.cpp の read(unsigned char* buffer, size_t len) と parsePacket() です。

int EthernetUDP::read(unsigned char* buffer, size_t len)
{

	if (_remaining > 0) {

		int got;
		// quick hack for _remoteIP and _remotePort
		struct sockaddr_in _saddr;
		socklen_t _saddr_len;
		_saddr_len = sizeof (struct sockaddr_in);

		if (_remaining <= len) {
			// data should fit in the buffer
			got = recvfrom(_sock, buffer, _remaining, 0, (struct sockaddr *)&_saddr, &_saddr_len);
		} else {
			// too much data for the buffer,
			// grab as much as will fit
			got = recvfrom(_sock, buffer, len, 0, (struct sockaddr *)&_saddr, &_saddr_len);
		}

		if (got > 0) {
                	// set _remoteIP and _remotePort 
			_remoteIP = ntohl(_saddr.sin_addr.s_addr);
			_remotePort = ntohs(_saddr.sin_port);

			_remaining -= got;
			return got;
		}

	}

	// If we get here, there's no data available or recv failed
	return -1;

}

同じソース内の parsePacketも修正します。

int EthernetUDP::parsePacket()
{
	// discard any remaining bytes in the last packet
	flush();
	_remaining = 0;
	_remaining = available();

	// reinitialize _remoteIP, _remotePort
	_remoteIP = INADDR_NONE;
	_remotePort = 0;

	return _remaining;
}

エレキジャックふろくの温度センサー LM73を Galileoから使ってみる

LM73は校正されているデジタル温度センサーで、I2Cバスでマイコンと接続することで、
簡単に温度測定ができます。

測定精度は 電源電圧 2.7V-4.5Vでは

  • 10°C to 80°C: ±1.0°C (max)
  • 25°C to 115°C: ±1.5°C (max)
  • 40°C to 150°C: ±2.0°C (max)

※電源電圧 4.5V ~ 5.5Vでは、各々0.5℃追加

このLM73にはI2Cアドレスが違う2タイプがあり、ピン設定と組み合わせてバスあたり6個接続できるようになっていますが、付録はT731=LM73CMIK-1でした。
ADDR端子をオープンで使いますので、I2Cのアドレスは 0x4cです。

サンプルコードとして記載しているものは、
Arduinoでエレキジャック付録のLM73を使う:初心者の電子の館:So-netブログ
に書かれているコードに対して、Wireクラスのメソッドの変更だけ行ったものです。

なお、消費電力を抑えるためにはワンショットモードもありますが、ここでは使いません。

#include <Wire.h>

int I2CAdrs = 0x4c;     // スレーブアドレス

int ret;

void setup() {
  Serial.begin(9600); 
  Wire.begin(); 

  Wire.beginTransmission(I2CAdrs);
  Wire.write((byte)0x04);
  Wire.write(0x60); // 14bit
  ret = Wire.endTransmission();
  
  Wire.beginTransmission(I2CAdrs);  
  Wire.write(0x00);
  ret = Wire.endTransmission();
  delay(100);
}

void loop() {  
  int data=0;
  
  Wire.beginTransmission(I2CAdrs);
  ret = Wire.requestFrom(I2CAdrs, 2);
  
  data = 0;
  if (Wire.available()) {
    data = Wire.read();
  } else {
    Serial.println("Wire not available.");
  }
  if (Wire.available()) {
    data = (data << 8 )| Wire.read() ;
  }
    
  ret=Wire.endTransmission();
  
  printdata(data);
  delay(2000);
}

void printdata(int data) {
  int data2;
  int data3;
  float data_f;
  
  boolean negative=false;

  if (data < 0 ) {  // マイナスならbooleanにtrueをセットしプラスに変換
    negative=true;
    data = -data; 
  }

  data2 = data >> 7; // 小数値切り捨て

  data_f = (float)(data >> 2 ) / 32;
  data_f = data_f - data2 ;

  data3 = data_f * 100 ;

  Serial.print ("Current temperature is "); 
  if (negative) {
    Serial.print("-");
  }
  Serial.print(data2);
  Serial.print(".");
  Serial.print(data3/10);
  Serial.print(data3 % 10);
  Serial.println(" C. ");
}||<

実行結果
>||
Current temperature is 26.31 C. 
Current temperature is 26.34 C. 
Current temperature is 26.37 C. 
Current temperature is 26.37 C. 
Current temperature is 26.37 C. 

I2C接続の温度センサーとしては外付け部品はパスコン1個だけ(ホスト側がI2Cバスをプルアップしていれば)ですから、使いやすいと思います。

次はもう少し精度の高い デジタル温度センサーを紹介します。

Arduinoは楽しい

学研の大人の科学27号のふろくでJapanino という Arduino互換を謳った基板がありました。

手持ちで1個あるので何時か使おうかなぁって思っていたのですが、いろいろと制約があるので、ツクモ ロボット王国さんで、アーテックさんの Studino という、

・AVRマイコン (ATmega168PA)

・DCモータードライバ

・プッシュスイッチ

サーボモーター用コネクタ

・DCモーター用コネクタ

・センサー用コネクタ

をもつ Arduino互換品を購入してきました。

 

注意点は、

  1. USBシリアルが FT232RLではなく、PL2303TA だということ
  2. コネクタ類のためにシールドと干渉する場合にはシールド用ピンソケットで浮かすこと
  3. サーボモーターやDCモーターを使う場合には外部電源必須

というぐらいのようですが、まだ未使用なので、おいおいスケッチをかきながら感想を書いていこうと思います。

 

LM4871 3W+3W AB級パワーアンプキットの製作 その1

NFJ さんのキットで お試し 140円のアンプの話です。

販売再開のご案内-お試し価格☆3W+3W★SMDタイプオーディオパワーアンプ自作キット - nfj_2009/株式会社NorthFlatJapan公式ブログ - Yahoo!ブログ

 

LM4871 は 電源電圧 2.2~5.5Vで、3Ω負荷に平均電力3WのAB級動作のモノラルICですが、それは放熱ランドを接続できるLLPパッケージの話で、このキットではSOP8パッケージ品を使ってますから8Ω負荷 1.5Wで使用します。

 

NFJさんでは0805(inch) = 2012(mm)のSMDをR,Cとも使用していますので、SMD部品のハンダづけ経験のない人が練習する材料としても好適となってますが、2.0x1.25mmでもハンダの表面張力をうまく使わないと結構しんどいです。

 

R1とR3を間違えて貼り直ししたのは結構つらかったです。

それにしても撮影してみると、フラックスはともかくハンダ付けが汚いですね。反省。

f:id:hanya501:20140223061455j:plain

 

LM4871 を使うのは初めてでしたが、AB級アナログアンプということで、D級アンプでノイズをまき散らせない箇所に使うのはありかと思います。

まだ火入れしていないので、次は使用感をレポートしようかと思います。

コネコネット Pontaの取り扱い終了

以前の日記 coneco.net の運営会社変更とPonta - はにゃぶろぐ はじめました で書きましたが、Pontaの取り扱いについて変更アナウンスがありました。

【重要】coneco.netにおける「Ponta」サービス終了のお知らせ | 価格比較サイト [coneco.net] コネコネット

要点は

  1. 『coneco.netポイントパーク』のPontaポイントの付与は2014年3月31日 16時をもって終了する
  2. 『coneco.net商品レビュー』のPontaポイントの付与は 2014年3月31日 23時59分59秒をもって終了する
  3. 新たなポイントの導入予定はない
  4. 体験レビューサービスは継続する

となります。

三菱商事系から ヤフーに親会社が変わった時点でいつPontaポイント付与を中止するのかってことだったのですが、年度末をもって中止されます。

私は coneco.netのポイントパークで vectorでの買い物などで活用してましたが、そもそも Yahoo! Shopping がある以上 ポイントモールを続ける理由はありませんからモールサービス自体消滅しますね。

 

あとはポイント付与が終了される前後での商品レビューの件数の変化が気になりますね。

商品レビューが減るようなことがあれば、ヤフージャパンが買収した意味が0になってしまいます。

価値を下げないように、Point付与に皮って体験レビューの本数増加など施策を打ってくると思ってますが、今後のプレスリリースに注目してみましょう。

 

Linuxから低レベルインターフェイス操作が楽しい Raspberry Pi

途上国の子供たちの教育を支援するために、OLPC XO-1という超低価格ラップトップPCが昔ありました。

いまでも途上国を取材したテレビ番組などで緑と白色のラップトップを見かけると思いますが、Raspberry Piは、コンピューター教育を進める目的で、

ARMベースの Linuxマシンに次のハードウェア機能を備えて、自分用のSDカードにブートイメージを入れて持ち込めば、いつでも自分のLinux/X11環境が手に入る一種のパーソナルコンピュータを 僅か 35ドルで提供しました。

  • HDMI/コンポジット出力でテレビと接続
  • USBでHIDを接続
  • 100BASE-Tでネットと接続 (Model Bのみ)
  • オーディオout
  • GPIO/UART/I2C/SPIでハードウェア拡張

ハードウェアとソフトウェアの垣根を超えシステムを実現したものとして、Arduinoがありますが、もう少し高度なことを実現しようとすれば、Raspberry PiはLinuxからGPIOを操作できることで、既存のプログラム類を活用しつつ、新しいチャレンジができるわけです。

私が購入予約したのは発売前でデリバリーまでとても待たされましたが、いまではそういうこともないし、Model Bはメモリも 256MBから512MBに強化されて余裕が増しています。

ZIGSOWのモチモノ登録リンク

http://zigsow.jp/?m=zigsow&a=page_fh_own_item_detail&own_item_id=219875

 

Xwindowを起動させて使うには Model.B 初期型は少しきつい感じがしますが、

昔の SPARCstation5よりメモリは大きいため、なんとかウェブブラウザも動作します。

Raspberry Pi Type B 512MB

Raspberry Pi Type B 512MB

 

いまどきシングルコアということで只のパソコンとしては使うより、ハードウェアを弄りやすいLinuxパソコンとして考えると、35ドルの割にはペリフェラルが充実してますし、USB 5V給電なので大容量バッテリーをつければ出先でも余裕で利用可能ですね。

あ、そうそうUSB充電アダプタは自分で用意しましょう。microUSB Bタイプですよ。

 

ところで、私は RS Components が扱っている Clear Case を使用していますが、拡張端子へのアクセスができないことと、分厚いので、SparkFunのケースのほうがおススメできそうです。 

Raspberry Pi Clear Case

Raspberry Pi Clear Case

 

 

Pi Tin for the Raspberry Pi - Clear

Pi Tin for the Raspberry Pi - Clear

 

 

備忘録を兼ねて

elinux.orgの情報へのリンクをのせておきます。

http://elinux.org/Rpi_Low-level_peripherals

P1はGPIO/UART/I2C/SPI をモードによって使い分けてます。

P2はVideoCore JTAG (8pin) ですが、Rev.2ボードではコネクタ未実装になってます

P3はLAN9512 JTAG(7pin)ですが、コネクタは未実装です

P5はRev.2ボードで追加された GPIO28-30,I2C0_SDA/SCL,電源ピンになります。

 

OSからこれらのペリフェラルを使うにはWebIOPi が便利のようです。

あと、面白いのはRaspberryPiDotNet library.C# ベースで楽しげですね。

 

これと、秋月電子/トライステートの FMステレオ/AMラジオ・モジュール・キットを接続してラジオにするのもありかと思ってます。

http://akizukidenshi.com/catalog/g/gK-03153/

手元にキットがあるので、そのうちやってみます。

しかし…難点はこのラジオキットの出力はアナログラインレベルなので、手っ取り早くネット経由で飛ばすには 、まず USB audio (inあり)が必要になりますね。

 

なお、Rev.2のP5ヘッダはALT2 Function時 I2S接続が使えます。

ALSA でも I2Sでの制御が可能になっているようなんで、そっちを使うのもありですね。

試された方のページ

三日坊主な私がいつまでブログやれるか...( ̄~ ̄;)

http://abc002.blogspot.jp/2013/05/raspberry-pi-alsa-i2s.html

 

なかなか面白いですね! そういえば、手元の TEAC CD-532E というCDプレーヤーは I2S出力を持ってますから、ちょっとした実験をしてみるのも面白いかな。

 

まぁ、こういった感じで夢は色々広がりますが、時間を確保しなければw

 

そろそろ Windows の Location and Sensor API ネタに戻らないとね。

 

Windows7/8.1環境から AHCIサポートしないチップセットを排除する

以前の記事

ICH7無印は残念な子でしたが、駄目な子ほどなんとやらってことで - はにゃぶろぐ はじめました」に書いた ICH7 環境は無事退役いたしました。

Windows7 32bit環境は Pentium G630T+H61マザーでAHCI化され、すっかりレガシーフリーになりました。

これでこのマシンをいつ SSD化しても大丈夫です。

 

ところで、この移行にあたりちょっとした問題がありました。

おもに次の3つです。

ATAPI→SATA変換アダプタがあるとはいえ、いまさら ATAPIを使うのもどうかと思うので、別のマシンについているSATAタイプのDVDドライブをBDに変えてスライドさせようかと思ってます。

 

シリアルについては、ピンヘッダはマザーボード(P8H61M-LX)にあるので、AINEXのリアスロット 1ポート RS-300を購入してOKでした。

 

アイネックス シリアルリアスロット 1ポート RS-300

アイネックス シリアルリアスロット 1ポート RS-300

 

 

切替機は、AREAのコンバティーノ SD-PS2CUSB を使いました。これですっきり。 

AREA PS2キーボード マウスUSB変換 コンバティーノ SD-PS2CUSB

AREA PS2キーボード マウスUSB変換 コンバティーノ SD-PS2CUSB

 

 

レガシーフリーマシンを最初に見たのは Intel i810チップセット時代ですから、もう10年以上昔ですが、いよいよシリアルもパラレルもIDEFDDも、そしてPCIもないマザーボードに今後置き換わるでしょう。

オープンアーキテクチャとはいえ、これだけのデバイスの進化によく耐えてますね。