2015年7月14日火曜日

ESP8266

つ素のままでは115200bpsのATのコマンドなので全然美味しくない。

SPI 2MHz以上で送受信して動くようにしたい。
また、C1098カメラの取り込みもしたい。

ここが参考になりそう。


3.3Vの電源(250mA以上)とUSBシリアルが必要。電源がない。。。
pro micro 3.3VのUSBシリアル変換できれば電源もあるので文字通り一石二鳥!

まずは、そのまま動かしてみる。
エルチカ(これから)
TCP接続(これから)

IoT SDKのUser Manualにある
ESP_FLASH_DOWNLOAD
<http://www.electrodragon.com/w/ESP8266_firmware_flasher>
にある

Arduino IDEでも開発できるらしい


以下を参考に、環境を作ってみる。

(これから)

nodeMCU
スクリプトで簡単にサーバーみたいなこともできるらしい
<https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/using-nodemcu-lua>

2015年5月11日月曜日

Edisonでmbed

タイトルだけ読むと誤解されそうだが、Edisonでmbedのプログラミングをしたいものです。

〜〜〜
2015.5.13追記
世の中には同じことを考える人は大体いて、先人のまとめがありました。
こちらはスタンドアローンでCUIでビルドできそう。
<https://developer.mbed.org/media/uploads/ytsuboi/mbed-fest-dec2014.pdf>
〜〜〜

以前に入れていたiceweasel(firefox)ではフォントが悪く文字の表示とカーソル位置がずれてしまいます。

試しにchromeを、入れてみます。
googleのサイトからdebファイルを落として
# aptitude install google-...deb
 
起動してみたけど、
挙動はiceweaselと、同じ。

システムかフォントのせいだね。

たぶんxwindowのレンダリングかな?

chromeでデフォルトのフォントをTakao明朝にすることで上手くいった。

ただし、円マーク¥はバックスラッシュ\をとしないとコンパイラーが警告を出す。

スイッチサイエンスからLPC824 mbedが届いたので、早速edisonにつなぐ。、

/dev/sdaをマウントして、binファイルをコピーして、アンマウントして、USBの抜き差しで再起動。

いわゆるLチカできました。

USBでのシリアルは
$ minicom -D /dev/ttyACM0
でモニターできました。

2015年5月9日土曜日

LPC824 mbed

小さくてもいろいろあって、pro microより高性能。mbedを使えばいろいろたのしめる?

スイッチサイエンスさんからmbedボードがてている。
これはpro microと同じサイズでRAMとクロックが3倍以上(3.3vで)。

これは使わない手はない。

edisonのfirefoxでmbed ideが使えるかが心配。

なお、300milのちっこいのもあるが内蔵RC発振でクロックの精度が低いので、jpegカメラとの高速通信に不安があるのと、ピンが一つ!足らないのでやめておく。

※生のlpc842は前にmaryように入手したLPCexpressoがあるからそれでフログラミングできるかな?


2015年4月24日金曜日

mbedをeclipse

<https://developer.mbed.org/handbook/Exporting-to-Eclipse-IDEs>

<http://developer.mbed.org/handbook/Exporting-to-GCC-ARM-Embedded>を参考にgccをいれ、
eclipseと、cdtプラグインを入れる。

あらかじめmbed ideでexportしたソースをeclipseでimportすればいい。

2015年3月13日金曜日

Edisonのubilinux 20150509

入れ直すのに落としてみたら新しくなっていた。

インストールして、ログインして、ふとlsをたたくと/rootのなかに
bluezとmraaがあった。
試しにhcitool scanするとデバイスが見えた。
ラッキー。

あと、/lib/modulesのなかを覗くとuvcが入っていた。

kernel差し替えはやらなくて良さそう。

2015年3月11日水曜日

EdisonでArduino

icdc-acmがいる?
入っていそう。

最新のubilinx(20150309)にしたら認識した。

でも、単にタイミングかもしれないが、更新したのを、戻すのも。。。

ただし、電源を補助しないとダメかも。



こんな感じでEdisonでArduinoできました。プログラミングはiPhoneから!

iceweasel をいれないとarduinoが起動しなかった。何か足らないみたい。

2015年3月10日火曜日

edisonでdropbox

http://www.maruko2.com/mw/DropboxをLinuxで利用する方法

sshでログインして作業
~/bin/dropbox.py start -i
でインストールは成功したが
~/bin/dropbox start
で管理IDが表示されない。
~/.dropbox-dist/dropboxd
で表示され、登録できた。
Dropboxフォルダーができるのでそこが同期される。

2015年3月5日木曜日

edisonをUSBホストとして使う

edisonのUSBはOTG対応だが、ホストとして使うにはUSB以外から電源供給が必要です。

リポほ怖いのでUSBモバイルバッテリーを使いたい。USBシリアルの端子にから供給できるとベスト。
sparkfunのボードはまさにそれに対応しているが、まだ日本では売っていない。

で、改造しましょ!

USBシリアルの端子は
に5Vが来ていますが、チョと手ハンダは厳しい。
裏返すと
このスルーホールに繋がっていました。
ここならなんとかとれるかな。。

電源ICには
ここのダイオードのランドを使えばいい。念のためにダイオードを挟む。

ダイオードは
http://akizukidenshi.com/catalog/g/gI-01707/


てな感じで接続。
このまんまじゃすぐに取れそうなのでホットボンドで補強。

ちゃんと、電源取れました。
これでUSBモバイルバッテリーでホストとして動かせます。
試しにカメラをつなげましたが、ちゃんと認識しました。

2015年2月5日木曜日

Edison(ubilinux)にbluetooth

https://communities.intel.com/mobile/mobile-access.jspa#jive-content?content=%2Fapi%2Fcore%2Fv3%2Fcontents%3Ffilter%3DentityDescriptor(2%2C257308)

しかし
# apt-get install libusb-dev
がいきなり失敗した。
GoogleDriveを使うためにダウングレードしたlibgcrypt11との依存関係がダメらしい。

一度、dpkg -r xxx してみるが、
依存関係があって削除できないってことなので、1.5.0を落として
dpkg -i xxx してみる、
<http://snapshot.debian.org/archive/debian/20110807T212024Z/pool/main/libg/libgcrypt11/>
のではなくて、

apt-get install libgcrypt11をして更新した。

apt-get install libusb-devが上手くいったので引き続き他も入れる。

$ apt-get install libusb-dev libdbus-1-dev libglib2.0-dev automake libudev-dev libical-dev libreadline-dev rfkill

$ tar xf bluez-5.24.tar.xz
$ cd bluez-5.24
$ ./configure –disable-systemd
$ make -j 2
$ sudo make install

imageをhttp://downloadmirror.intel.com/24389/eng/edison-image-rel1-maint-rel1-ww42-14.zipから落として、
PCにおいて
$ unzip edison-image-rel1-maint-rel1-ww42-14.zip
$ mkdir /tmp/edison
$ sudo mount edison-image-edison.ext4 /tmp/edison/
$ scp -r /tmp/edison/etc/bluetooth root@192.168.xxx.xxx:/etc/.
$ scp /tmp/edison/usr/sbin/bluetooth_rfkill_event root@192.168.xxx.xxx:/usr/sbin/.
$ scp /tmp/edison/usr/sbin/brcm_patchram_plus root@192.168.xxx.xxx:/usr/sbin/.

edisonで、
$ sudo mkdir /etc/firmware
$ sudo cp /lib/firmware/bcm43341.* /etc/firmware/

あとは、最初のリンクの通りの設定で、bluetooth deviceを見つけることができました。
どう使うかはこれから考える。。。。

2015年1月10日土曜日

edisonにGoogle Drive

<http://xmodulo.com/mount-google-drive-linux.html>
を参考に作業。

まずはocamlを入れる。

更新してgoogle-drive-ocamlfuseを入れるが動かない。

apt-getでfuse, curlをいれる。
xdg-open がないと言われるので
xdg-utilsも入れる。
でも動かない。

segmentation fault 
で調べると、libcryptのバグの可能性。
<https://github.com/astrada/google-drive-ocamlfuse/issues/104>

gdbもいれてバックトレースを確認すると
libgcrypt.so.11で落ちている。

1.5.0のバグらしい。
1.4.6-9に置換したら動いた。

<http://snapshot.debian.org/archive/debian/20110807T212024Z/pool/main/libg/libgcrypt11/>から落として、
dpkg -i xxxした

2015年1月9日金曜日

ウチのedisin

2015.3.9
やはり逝ってました。breakoutboardは行きました(; ̄ェ ̄)
新しいの届いたので、ubilinux入れて、
kernel入れ替え、
wifi設定、

auto wlan0
iface wlan0 inet dhcp
    # For WPA
    #wpa-ssid Emutex
    #wpa-psk passphrase
    wireless_mode managed
    wireless_essid any
    wpa-driver wext
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.con
 
/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netd
ev

network={
        ssid="ssid"
        scan_ssid=1
        key_mgmt=WPA-PSK
        psk="psk"
}

いろいろ設定
<http://rikachann.slmame.com/e1497908.html>
visudo

/var/cache/とかをhomeに退避

2015.3.5のうちのedison
逝っちゃったかも。。。
リポの端子に12V入れてしまった。
電源ICだけならいいけど。
とりあえず、また、秋月さんで
ポチッとな。、、

2015.1.9時点でのうちのedisonの状況

ubilinuxをいれる
kernelはuvcを有効にしたyoctoと差し替え
<http://shiitakeo.hatenablog.jp/entry/2014/12/06/225139>
/boot/
/lib/modules

tightvncserver をいれる
arduino ideをいれる
wpa_supplicantを設定して自宅wifiに自動接続

次にやりたいのは、
USBコネクタを追加してそこから電源供給できるようにする
→USBホストとした時の電源供給

2014年12月19日金曜日

edison にvnc(debian 成功)してarduino ide

yoctoでは上手くいかないので、以前に試したdebian で進める。
以下の順番でapt-get install
xvfb (何度か試したがこれやらないと上手く動かなかった)
x11vnc
fluxbox
tightvncserver

$ tightvncserver で起動して、パスワード設定
<http://qiita.com/ryunosinfx@github/items/ad1956eafc6a94477897>

~/.vnc/xstartup
#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
#/etc/X11/Xsession
amule &
fluxbox &


自動起動の設定は
/etc/init.d/tightvncserver

#!/bin/sh
### BEGIN INIT INFO
# Provides:          tightvncserver
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start/stop tightvncserver
### END INIT INFO

# More details see: 
# http://www.penguintutor.com/linux/tightvnc

### Customize this entry
# Set the USER variable to the name of the user to start tightvncserver under
export USER='edison'
### End customization required

eval cd ~$USER

case "$1" in
  start)
    su $USER -c '/usr/bin/tightvncserver :1'
    echo "Starting TightVNC server for $USER "
    ;;
  stop)
    pkill Xtightvnc
    echo "Tightvncserver stopped"
    ;;
  *)
    echo "Usage: /etc/init.d/tightvncserver {start|stop}"
    exit 1
    ;;
esac

exit 0


(中身はクグル)
<http://www.penguintutor.com/linux/tightvnc>
を作って、
# update-rc.d tightvncserver defaults

apt-get install iceweasel
でブラウザ入れる

ブラウザの日本語は豆腐になるので、
apt-get install ttf-takao*
で日本語表示OK

javaはOracleからバイナリを落として
/usr/local/javaに展開して
# ln -s /usr/local/java/jre..../bin/java /usr/bin/java

Arduino IDE 1.0.6も落としてきて、展開。
xtermから起動すると無事動きました!

2014年12月9日火曜日

edisonにvnc(yocto失敗中)

http://packages.yoctoproject.org

edsison-src/device-software/meta-edison-distro/conf/distro/pockey-edison.conf
DISTRO_DISTRP_FEATURES
に、x11を追加

bitbake x11vnc

http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#usingpoky-extend-addpkg

edison-src/build/local.conf
IMAGE_INSTALL_append=" x11vnc"

UVCもついでにいれて、
ルートも1GBに拡張できました。
<http://research.itplants.com/?p=774>
を参考にしましたが、
edison.envの方は1024MiB
edison-image.bbの方は1048576
(1024 x 1024)
こうしないとedisonが起動失敗しました。

でもウインドウマネージャーが、入っていませんでした。

まだまだ先は長い。
matchboxに挑戦!?

マッチボックスはyicyoのパッケージにあるので問題ないのですが、
どうやらXbfbがインストールされてないようです。

いろいろ調べても方法がわかりません。
xorg-xserver.incのなかでは--enable-xbvfされているようです。

駄目元で、最初からやり直してみるか?

2014年12月8日月曜日

edisonのyocto bitmake

/のサイズを、変更できるらしいし、
http://research.itplants.com/?p=774
vncserverを追加したいのでbitbakeに、とらいしてみる。

mac book 2009(core2 duo)のparallels の上のubuntuではカナリツライ。。。

おまけに途中でこけた。(原因不明)
強制リセットしたが、bitbakeが失敗して進まない。
stampディレクトリーに進捗情報があるので、失敗するgettext ディレクトリーを削除して復活!

続く。

2014年11月29日土曜日

Intel Edisonでdebian

すかポーンとEdison breakout boardを買ってしまったわけですが、使い道が。。。

今はArduinoに取り組み中。

webをさまよっているとdebianが入るらしい。
おまけにvncを動かした人もいる。
<http://linyi-zatta.blogspot.jp/2014/11/edison-on-debian.html?m=1>

BBBの代わりにいいじゃん。
Wi-Fiついてるし。

でも一つ問題。
USBにArduinoを繋ぐとedisonに給電出来ません(-。-;

→http://www.amazon.co.jp/gp/aw/d/B00C0M5SFS/ref=pd_aw_sbs_computers_3?refRID=1EN8PMQ0FE3B1Z73A7JC

前に買ったこれでなんとかなるかな?

debian化して
vncは
http://qiita.com/ryunosinfx@github/items/ad1956eafc6a94477897
を参考にインストール。

自動起動は
http://d.hatena.ne.jp/lycoris_blog/touch/20130217/1361114310

2014.12.5 追記
USB OTGケーブルで電源供給とArudino接続したがにんしきしなかった。(-。-;
ケーブルか?ハードか?ソフトか?

-> breakout boardの説明をちゃんと読むと、vbusの電圧でhostにつながっているか判断している模様。
jp21とかから給電するしかないか。。
USBバッテリー使いたいが。
 5V_SYSに入れればいいのはわかっているが、パッドがない。ダイオードのパッドに繋ぐ?

3.3V作ってVSYSに入れたほうがいいかな。

あと、apt-get install rfkillしてrfkill unblock blutoothしたけどhci0は見えない。

2014年11月26日水曜日

BBBでArudino IDE

構想。

eMMCにdebianを入れて、
Arduino IDEを入れる。

VNCサーバーを立ち上げて
VNC Viewer for iOSでリモートアクセス。

bluetooth keyboardもあるといい。

2014年11月1日土曜日

Arduinoで遊ぼう(8) モーター制御

世の中的には普通でしょうが、
どうしましょうか。

前にXBeeか制御した時はTB6612FNGを使ったのですが、XBeeのPWMの周波数が15.6kHzのせいかはわかりませんが、うまく速度制御できず、PWMをinhibitにいれてやりました。
モーターのせいかもしれません。

今回は、スイッチサイエンスのDRV8835を使うのでどうなるか?

ArduinoのanalogWrite()でのPWMは約490Hz。

周波数の変更は
http://theoriesblog.blogspot.jp/2014/05/arduino-pwm.html?m=1
が参考になります。

使おうとしているのはD6,D9。
pins_arduino.hによるとD9,D10が
OC1A,OC1Bで同じ周波数になるので良さそう。
pro micro 3.3Vは8MHzなので245Hzかな。

単純にanalogWrite()で問題なく制御できました。
DRV8835はmodeを1にして制御。


2014年10月30日木曜日

Arduino で遊ぼう(7) static constは、、、

Arduinoはstatic const で宣言してもramを使うことを初めて知った!
http://www.cloverfield.jp/2014/05/06/603

そりゃ、Htmlを長くするとメモリー足らなくなりますね。

ここに分かりやす解説がありました。
https://learn.adafruit.com/memories-of-an-arduino/you-know-you-have-a-memory-problem-when-dot-dot-dot

とりあえずF()マクロで100バイトくらい節約!

次はPROGMEMの登場。

コンテンツはフラッシュにおけるようになりバッファに余裕ができました。

これでコンテンツに安心してjavascriptを追加できます。

Arduino で遊ぼう(6) ネットワークカメラ

Pro Micro 3.3V + XBee WiFi + C1098-SS
でネットワークカメラになりました。

でも、RAMが辛いのかHTMLを少し長くしたりするとうまく動かなくなる。

カメラのライブラリのチューニングが必要かな。

とりあえず、今のスケッチ

〜〜〜〜〜〜

#include <SPI.h>
#include <CameraC1098.h>

/*
 XBee WiFi Connected Serial.
 XBee works in API Mode.

 Receive Serial and Parse API packet,
 then echo back by API packet.
 */
/**
 * 送信パケットの生成
 */
int makeXBeeApiSendIp(byte* pPacket, unsigned short u16Size, byte* pbIpAddrDst,
byte* pbPortDst, byte* pbPayload, word length) {
if (u16Size < length + 16) {
Serial.println("buffer too short");
return -1;
}

// パケット生成
pPacket[0] = 0x7E;
// length
u16Size = length + 12;
pPacket[1] = u16Size >> 8;
pPacket[2] = u16Size & 0x00FF;
// API Cmd
pPacket[3] = 0x20;
// FrameID
pPacket[4] = 0x00;
// IpAddrDst
pPacket[5] = pbIpAddrDst[0];
pPacket[6] = pbIpAddrDst[1];
pPacket[7] = pbIpAddrDst[2];
pPacket[8] = pbIpAddrDst[3];
// PortDst
pPacket[9] = pbPortDst[0];
pPacket[10] = pbPortDst[1];
// PortSrc
pPacket[11] = 0x26;
pPacket[12] = 0x16;
// Protocol
pPacket[13] = 0x01; //< TCP
// Transmit Options
// pPacket[14] = 0x00; //< Leave Socket open
pPacket[14] = 0x02; //< Terminate Socket after tx complete

// Payload
for (int i = 0; i < length; i++) {
pPacket[15 + i] = pbPayload[i];
}
// チェックサム計算
byte sum = 0;
for (int i = 0; i < length + 12; i++) {
sum += pPacket[3 + i];
}
pPacket[length + 15] = 0xFF - sum;

return length + 16;
}

/**
 * 受信パケットのダンプ
 */
void printPayload(byte* pPayload, word length) {
if (0 < length) {
// Serial.println("dump");
for (word i = 0; i < length; i++) {
// Serial.print(pPayload[i], HEX);
// Serial.print(",");
Serial.print((char) pPayload[i]);
}
// Serial.println();
}
}

/**
 * 受信パケットのパース
 */
byte g_pbIpAddrSrc[4];
byte g_pbPortSrc[2];
byte* g_pbPayload;
int parseXBeeApiReceiveIp(byte* pPacket, unsigned short u16Size,
byte* pbIpAddrSrc, byte* pbPortSrc, byte** ppbPayload) {
// APIコード確認
if (0xB0 != pPacket[3]) {
// Serial.print("wrong api code:");
// Serial.println(pPacket[3]);
return -1;
}
// 送信元IPアドレス取得
pbIpAddrSrc[0] = pPacket[4];
pbIpAddrSrc[1] = pPacket[5];
pbIpAddrSrc[2] = pPacket[6];
pbIpAddrSrc[3] = pPacket[7];
//        Serial.write(pbIpAddrSrc, 4);
//        Serial.println();
// 送信元ポート取得
pbPortSrc[0] = pPacket[10];
pbPortSrc[1] = pPacket[11];
//        Serial.write(pbPortSrc, 2);
//        Serial.println();
// ペイロード取得
*ppbPayload = &pPacket[14];

//        Serial.println(pPacket[1]);
//        Serial.println(pPacket[2]);

return ((int) pPacket[1] << 8) + (int) pPacket[2] - 11;
}

/**
 * 受信処理
 */
#define RECEIVE_IP 1
unsigned char u8ReceiveMode = 0;
#define RECEIVE_MODE_IDLE 0
#define RECEIVE_MODE_LEN1 1
#define RECEIVE_MODE_LEN2 2
#define RECEIVE_MODE_DATA 3
#define RECEIVE_MODE_CS 4
#define APIPACKET_SIZE_MAX 512
byte g_pu8ApiPacket[APIPACKET_SIZE_MAX];
unsigned short g_u16ApiPacketSize;
unsigned short g_u16ApiPacketLength;
int parseXBeeApiChar(byte data) {
// Serial.println(data, HEX);

switch (u8ReceiveMode) {
case RECEIVE_MODE_IDLE:
// wait for "0x7E"
if (0x7E == data) {
g_u16ApiPacketSize = 0;
g_u16ApiPacketLength = 0;
g_pu8ApiPacket[g_u16ApiPacketSize++] = data;
u8ReceiveMode = RECEIVE_MODE_LEN1;
// Serial.println("api start");
}
break;
case RECEIVE_MODE_LEN1:
g_pu8ApiPacket[g_u16ApiPacketSize++] = data;
u8ReceiveMode = RECEIVE_MODE_LEN2;
break;
case RECEIVE_MODE_LEN2:
g_pu8ApiPacket[g_u16ApiPacketSize++] = data;
u8ReceiveMode = RECEIVE_MODE_DATA;
g_u16ApiPacketLength = ((unsigned short) g_pu8ApiPacket[1] << 8)
+ (unsigned short) g_pu8ApiPacket[2];
// Serial.print("get len :");
// Serial.println(g_u16ApiPacketLength);
if (g_u16ApiPacketLength > (APIPACKET_SIZE_MAX - 4)) {
Serial.println("invalid data len");
u8ReceiveMode = RECEIVE_MODE_IDLE;
}
break;
case RECEIVE_MODE_DATA:
g_pu8ApiPacket[g_u16ApiPacketSize++] = data;
if ((g_u16ApiPacketSize - 3) >= g_u16ApiPacketLength) {
u8ReceiveMode = RECEIVE_MODE_CS;
// Serial.println("get data");
}
break;
case RECEIVE_MODE_CS:
g_pu8ApiPacket[g_u16ApiPacketSize++] = data;
u8ReceiveMode = RECEIVE_MODE_IDLE;
// Serial.println("get cs");
return RECEIVE_IP;
break;
default:
break;
}
return 0;
}

/**
 * SPI制御
 */
byte XBEE_SPI_ATTEN = 4;
byte XBEE_SPI_CS = 5;
/**
 * SPI初期化
 */
void spiInit() {
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV4); //< 8MHz/4=2MHz
SPI.begin();

// XBee SPI ATTEN
pinMode(XBEE_SPI_ATTEN, INPUT);

// XBee SPI CS
pinMode(XBEE_SPI_CS, OUTPUT);
digitalWrite(XBEE_SPI_CS, HIGH);

}

/**
 * SPI受信
 * @note 受信のみ
 */
int spiReceive() {
int len = 0;
if (LOW == digitalRead(XBEE_SPI_ATTEN)) {
digitalWrite(XBEE_SPI_CS, LOW);
if (RECEIVE_IP == parseXBeeApiChar(SPI.transfer(0x00))) {
len = parseXBeeApiReceiveIp(g_pu8ApiPacket, g_u16ApiPacketSize,
g_pbIpAddrSrc, g_pbPortSrc, &g_pbPayload);
Serial.print("[receive ip packet:");
Serial.print(len);
Serial.print("]");
Serial.println();
printPayload(g_pbPayload, len);
}

if (HIGH == digitalRead(XBEE_SPI_ATTEN)) {
digitalWrite(XBEE_SPI_CS, HIGH);
}
}

return len;
}

/**
 * SPI送信
 * TODO 送信中の受信処理
 */
void spiSend(byte* pData, word length) {
digitalWrite(XBEE_SPI_CS, LOW);
for (int i = 0; i < length; i++) {
SPI.transfer(pData[i]);
}
digitalWrite(XBEE_SPI_CS, HIGH);
}

static const char gsc_pcHtmlHeader[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"Connection: close\r\n"
"Content-Length: ";
#define USE_JAVASCRIPT
#ifdef USE_JAVASCRIPT
static const char gsc_pcHtmlContents1[] =
"<html>"
"<head>"
"<script type=\"text/javascript\">\r\n"
"myImage = new Image();\r\n"
"count = 0;\r\n"
"function loadImage(url) {\r\n"
"myImage.onload = function(){\r\n"
"loadImage(url);\r\n"
"document.getElementById(\"img_mine\").src = myImage.src;\r\n"
;
static const char gsc_pcHtmlContents2[] =
"}\r\n"
"myImage.src = url + \"?\" + count.toString();\r\n"
"count++;\r\n"
"}\r\n"
"</script>"
"</head>\r\n"
"<body>"
//"<h1>hello world</h1>"
//"message from Arduino<br/>"
"pro micro 3.3V<br/>"
//"with XBee WiFi<br/>"
;
static const char gsc_pcHtmlContents3[] =
//"connected by SPI<br>"
//"<address>su4yamamoto</address>"
"<br/>"
"<img id=\"img_mine\"/>\r\n"
"<script type=\"text/javascript\">\r\n"
"loadImage(\"img.jpg\");\r\n"
"</script>\r\n"
"</body>"
"</html>"
;
#else // #ifdef USE_JAVASCRIPT
static const char gsc_pcHtmlContents1[] =
"<html>"
"<head>"
"<meta http-equiv=\"Refresh\" content=\"5\">"
"</head>"
"<body>"
"<h1>hello world</h1>"
"message from Arduino<br/>"
"pro micro 3.3V<br/>"
"with XBee WiFi<br/>"
"connected by SPI<br>"
"<address>su4yamamoto</address>"
"<br/>"
"<img src='img.jpg'/>"
"</body>"
"</html>";
#endif // #ifdef USE_JAVASCRIPT
static const char gsc_pcHtmlHeaderJpeg[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: image/jpeg\r\n"
"Connection: close\r\n"
"Content-Length: ";
static const char gsc_pcHtmlLineFeed[] = "\r\n\r\n";
static const char gsc_pcHtmlNotFound[] = "HTTP/1.1 404 Not Found\r\n"
"Content-Type: text/plain\r\n"
"Content-Length: 9\r\n"
"\r\n"
"Not Found\r\n";

CameraC1098 camera(&Serial1);
uint32_t pictureSizeCount = 0;
/**
 * This callback is called EVERY time a JPEG data packet is received.
 */
void getJPEGPicture_callback(uint32_t pictureSize, uint32_t packageSize,
uint16_t packageCount, byte* package) {
if (0 == pictureSizeCount) {
Serial.println();
Serial.print("jpeg size:");
Serial.println(pictureSize);
#ifndef HTML_HELLOWORLD
// first time -> send size info
char pcLength[16];
String strLength = String(pictureSize, DEC);
strLength.toCharArray(pcLength, sizeof(pcLength));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) pcLength,
strLength.length()));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlLineFeed,
sizeof(gsc_pcHtmlLineFeed) - 1));
#endif
}
// packageSize is the size of the picture part of the package
pictureSizeCount += packageSize;

// Serial.write(package, packageSize);
Serial.print(packageSize);
Serial.print(":");
Serial.println(pictureSizeCount);
#ifndef HTML_HELLOWORLD
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX, g_pbIpAddrSrc,
g_pbPortSrc, package, packageSize));
#endif//#ifdef HTML_HELLOWORLD
if (pictureSizeCount >= pictureSize) {
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlLineFeed,
sizeof(gsc_pcHtmlLineFeed) - 1));
Serial.flush();
Serial.println();
Serial.println("finished");
}
}
void getJpegImage() {

if (!camera.sync(CameraC1098::BAUD57600)) {
Serial.println("Sync failed");
return;
}

if (!camera.initial(CameraC1098::BAUD57600, CameraC1098::JR_320x240)) {
Serial.println("Initial failed");
return;
}
if (!camera.setPackageSize(64)) {
Serial.println("Package size failed.");
return;
}

if (!camera.snapshot()) {
Serial.println("Snapshot failed.");
return;
}

pictureSizeCount = 0;
if (!camera.getJPEGPicture(PROCESS_DELAY, &getJPEGPicture_callback)) {
Serial.println("Get JPEG failed.");
return;
}
}

byte toggle = 0;
void setup() {
// SPIの初期設定
spiInit();

Serial.begin(115200); //This pipes to the serial monitor
Serial1.begin(14400);
}
void loop() {
int len = spiReceive();

if (0 < len) {
// html reply
// Check Request
String strReq = String((char*) g_pbPayload);
                if (strReq.startsWith("GET /index.html")) {
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc,
(byte*) gsc_pcHtmlHeader,
sizeof(gsc_pcHtmlHeader) - 1));
char pcLength[16];
#ifdef USE_JAVASCRIPT
String strLength = String(
                                          sizeof(gsc_pcHtmlContents1) - 1
                                            + sizeof(gsc_pcHtmlContents2) - 1
                                            + sizeof(gsc_pcHtmlContents3) - 1
                                            , DEC);
#else //#ifdef USE_JAVASCRIPT
String strLength = String(sizeof(gsc_pcHtmlContents1) - 1, DEC);
#endif //#ifdef USE_JAVASCRIPT
strLength.toCharArray(pcLength, sizeof(pcLength));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) pcLength,
strLength.length()));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlLineFeed,
sizeof(gsc_pcHtmlLineFeed) - 1));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlContents1,
sizeof(gsc_pcHtmlContents1) - 1));
#ifdef USE_JAVASCRIPT
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlContents2,
sizeof(gsc_pcHtmlContents2) - 1));
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlContents3,
sizeof(gsc_pcHtmlContents3) - 1));
#endif//#ifdef USE_JAVASCRIPT
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc, (byte*) gsc_pcHtmlLineFeed,
sizeof(gsc_pcHtmlLineFeed) - 1));
                }
else if (strReq.startsWith("GET /img.jpg")) {
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc,
(byte*) gsc_pcHtmlHeaderJpeg,
sizeof(gsc_pcHtmlHeaderJpeg) - 1));
getJpegImage();
} else {
Serial.println("invalid http request");
spiSend(g_pu8ApiPacket,
makeXBeeApiSendIp(g_pu8ApiPacket, APIPACKET_SIZE_MAX,
g_pbIpAddrSrc, g_pbPortSrc,
(byte*) gsc_pcHtmlNotFound,
sizeof(gsc_pcHtmlNotFound) - 1));
return;
}

}

#ifndef HTML_HELLOWORLD
if (0 < Serial.available()) {
while (-1 != Serial.read())
;
getJpegImage();
}
#endif
}

2014年10月29日水曜日

Arduino で遊ぼう(5) シリアルJPEGカメラをつなぐ

ふ 以前に買っていたシリアルjpegカメラをつなげます。

http://arms22.blog91.fc2.com/blog-entry-261.html
にArduinoのサンプルがあったので利用させていただきました。

C1098むけに若干の修正とハードシリアルに変更させていただきました。

※最初、pro microの容量が足らないのかうまくうごきませんでした。
電源別にしてうまく動きました。
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Boards/Pro_Micro_v13.pdf
によると500mAは供給出来るはずなので大丈夫そうなんですが。。。

2014/10/30 追記
よくしらべるとプレップボードでの接触不良でした。