2015年08月03日

Maker Faire Tokyo 2015

というわけで行ってきました。たまたま、ドールイベント(アイドール)が同日にあったんで、ついでということで。午前中に浜松町であったアイドールに行ってドール関連の見物や買い物をしたあとに竹芝からゆりかもめでビッグサイトです。
このイベント、一度も行ったことなかったんで、組み込み系のモノのイベントだからGEEKっぽい人が多いのかな?と思ったら、若い子や子供連れの人も多くて至って普通のイベントでした(ぉ もらったり買ったりしたのはこんな感じです。
b4489.jpg
特に目的もなく行ったのでぶらついただけでしたが、無謀にもQマウントで魚眼レンズなんか作ってるとこがあって買ってしまいましたw 以前に持ってた会社で現物支給された労組の記念品でもらったコンデジが壊れて、PENTAXのQ7に変えていたので、これは買わなくてはいけないだろう、ってことで。焦点距離が1.8mmとか、アホのような値なので、撮影するとすごいことになります。
b4493.jpg
b4492.jpgb4490.jpg
筐体は3Dプリンタで作ってあるんで、積層のあとがあったり結構精度としては?ですが、トイレンズとしてはいいんじゃないでしょうか。ということで、その場で装着してビッグサイトでちょっといくつかとってみたんで作例。実際にはトリミングして使う感じでしょうけど、全天球って感じで映るのが面白いです。ピント合わせが難しいので、眠い画質ですが仕方ないですね。
b4495.jpgb4494.jpg
b4496.jpgb4497.jpg
あとはおまけ基板に釣られて買ったFlashAirとか。むかーし、仕事でコレのCustomerSample版を使って評価アプリケーションを作ったことがあるのですが、いまはえらく妙な機能がいろいろ載っているんですね。せっかくなので、なにか作ってみようかな。
b4498.jpg
さっと見まわってたらDDミクさんを発見w ドール用地震シミュレータって何?w
b4499.jpg
あと、Oculus Riftを使ったフリーフォール体験とかは面白かったです。上に上がっていくエレベータにカメラが乗っていて、HMDをつけた人がその景色を見られるかんじになっているので、自分も試させてもらいましたが、落ちるときのリアル感が半端ではないです。結構会場でもHMDを使った展示物が多くて、やっぱりHMDはいまのトレンドだよなーと思ったり。下の動画の最初の方に出ているものです。
b4500.jpgb4508.jpg
トランジスタだけで作ったCPU。でも、ほんの4,50年前の電卓はコレだったんですよね・・・。
b4501.jpg
b4502.jpgb4503.jpg
b4504.jpgb4505.jpg
あと懐かし目でi4004とか。会社にセラミックパッケージの4KbitDRAMとかあったなーとか思い出しました。
b4506.jpg
キーボードを使って鳴らすオルゴールとか。
b4512.jpgb4513.jpg
某掲示板でPDAの話が出ると必ずこの写真がはられてたような・・
b4509.jpg
b4510.jpgb4511.jpg
b4514.jpgb4515.jpg
b4516.jpgb4518.jpg
パタパタと羽ばたく感じで飛ぶ飛行機。駆動モーターはいわゆる携帯のバイブで使うモーターを使って、こんなので飛べるんだーなんてちょっとびっくり。
b4519.jpgb4517.jpg
ペッパー勢揃いとかあまりお目にかかれないですね。子どもたちにいろいろ人気でした。
b4520.jpgb4521.jpg

今回の私的なダイジェスト動画
スマホなどでリンク出ない人向け→リンク
posted by もろぼし☆らむ at 01:00| Comment(2) | TrackBack(0) | 電子工作

2015年06月29日

ポケットミクをDDミクさんに組み込む

b4419.jpg
今更な話題ですがw ここ最近ポケットミクをいじっていました。やりたかったことは大体やった感じなので、取りあえずお披露目です。
そもそもポケットミクを買った理由がバラして組み込みでなんか使えないかな、という感じで、たぶんみんなそう思って買ったのだと思いますが(偏見)、基本MIDI楽器なのとUSBデバイスで色々扱いにくかったり、妙なCPUが載ってたりと解析するのも面倒くさいし、音声データが抜けたとしてもそれはそれで他で使うと問題があったりするんで、あんまり流行らなかった感じですね。
というわけで、なんとかコレを正々堂々と電子工作に使えないかってことで、作ったのがコレです。
今回は折角なので概略説明と動作デモを動画にしてみましたので、見てみてください。無駄にフルHDで作ってみました(ぉ
あと、録音があまりよくないので、音量小さめになってしまってるんで、うまく聞こえない場合には音量調整願います。


回路図はこんな感じ。秋月のキットを色々組み合わせてる超手抜きです(ぉ
b4421.BMPb4420.jpg
結局のところ、USBのMIDI Classデバイスなのが面倒くさい元なんで、だったらUSBホスト対応のマイコンにMIDI Class対応のファームウェアを乗っけて、そこからシリアルなどの簡易なインターフェイスで制御可能なブリッジを造ってしまおうってことです。今回はどうせならということで、DDミクさんに組み込める程度の小型化をしています。
b4423.jpg
ただ、どうしても現状は電池が入らなかったので、ボディの外に出しています。スピーカーは一応はいるのですが、音がこもり気味になるので、今のところはこれも外に出しておいてあります。一番問題の電源はワイヤレス給電にでもしようかなーと考えてはいます。受電用のコイルはお尻のところにでもいれておけば、スタンドに送電コイル入れればいけるかも、とか。。
b4424.jpg
いまのところは動画のようにNXPのCoretex-M3ベースのARMマイコンであるLPC1769のLPCXpresso評価ボードにくっつけてます。mbedでなくコレなのは、DDに仕込むにはこのサイズが限界だからです(ぉ なおポケミク基板はダイヤモンド歯のサーキュラーソー(PCBカッター)で限界まで切り刻んでます。
シリアルはデバッグ用に1つ、Androidなどと接続するためにBluetoothモジュールと接続することを意識しているものを1つ使ってますが、ここから簡単なMMLを入力すると対応するMIDIパケットを生成しUSB経由でポケミクに投げて、自由に発声させることができます。MMLは基本はむかーしのBASICのPLAYコマンドとかで使ったモノを音声対応に拡張した文法でこんな感じ。なお、#の後ろの数値は文字テーブル番号ここで発声する言葉を指定して、あとは音階や音符を指定する感じです。お手軽w

MML,T160V100O5#4E4#71F4#110G1  < これをブリッジ経由で入れるとミクさん声で「おはよー」と言ってくれます

デモではこの数値を実際はAndroidを間にかませて、文字列を自動的にこんなMMLに変換してブリッジへ送信する感じにしています。
ただ、MMLだけですとあまり凝ったことはできませんので、SMF(Standard MIDI Fileformat)ファイルの解析処理を追加して、簡単なAndroid用のMIDI再生機能を付けました。これでMIDIシーケンサーで作ったファイルを簡単にポケミクでリモート再生することができますから、DDミクさんに本格的に歌って貰うことができます。この処理は現状はAndroid側で実際にUSBに転送するレベルのパケットに変換するまで分解しているので、ARMマイコン側ではBluetoothで受信したパケットをそのままUSBバスへ指定された時間通りに垂れ流す処理しかしていませんが、マイコン側で全部やらせることも可能です。ただこういうマイコンはRAMが少ないので(LPC1769では64KB)、ちょっと工夫が必要です。現状のAndroidのソフトではMIDI解析用のクラスを作って、その中でSMFファイルの取り込みし、全トラックの全イベントをArrayListに登録したあとにイベント時間順にソートすれば済むので楽ですが、滅茶苦茶RAMを使います。
でもやってみてわかったのは、ミクさんの声を入れた曲データを作る方が遙かに大変だということです・・・(動画の前奏の声データを作るだけで一日がかり)。トラックのノートに自動的に音声用のシステムエクスルーシブを追加するのは大したことがないのですが、これを自然に聞こえるように調整するのが難しいです。
ちなみにポケミクの音声出力周りの回路はこんな感じです。
b4422.BMP
スピーカーとライン出力の切り替えはハード的に切り替えているのではなくて、ソフト的にR47につながるポートの電圧をみて切り替えてるようです。このとき、ライン出力になにかさしているとH,ささってないとLになります。ライン出力コネクタに何か挿していても起動時に一瞬スピーカーがなるのはこのせいかもしれません。
ポケミクのラインアウトの回路ではカップリングコンデンサ(C22とC23)がセラコンなんで、コンデンサの特性上、音声信号に歪みを発生させる可能性があります。ここはライン出力を使う場合には、電解コンに置き換えた方がよいかと思います。なお、スピーカーは直接CPUの別ポートからドライブしているみたいです。このハードでカップリングコンデンサの前から信号を抜いて外部アンプに入れているのはそういった理由です。まぁ、音源ソースがそんなにキレイなものではないので、違いは気分程度でしょうがw
詳細はプログラムコードと一緒にそのうちWebページにアップする予定ですが、USBで組み込み系CPUで外部制御できてしまえば、たとえば時計の時報のお知らせにミクさんの声が使えたりと色々ポケットミクにも応用ネタが出てきますので、挑戦してみるとよいでしょう。
posted by もろぼし☆らむ at 00:15| Comment(0) | TrackBack(0) | 電子工作

2013年01月19日

ソウルジェムライト点滅改造

すっかりドールやらガレキばっかりいじっていたので、電子工作のリハビリの一環で最近ガチャポンで発売されたまどマギグッズであるソウルジェムライトを原作風に改造してみました。まぁ、いわゆるまず電子工作で初心者が手はじめにやるLEDチカチカですw
制御マイコンはソウルジェムライトの小さな空間に納めるためAtmelのATtiny45VのSOP版を使いました(千石電商で購入)。そんなわけで、久しぶりのJTAGICEmk2やらを引っ張り出して、AVRの開発環境も未インストール状態だったのでインストールしてみましたが、最新版のATMEL Studio ver.6ってVisual studio 2010ベースなんですね。いつの間に・・・・^^; すっかり浦島太郎です。以前のはEclipseベースでデバッグでもイライラしっぱなしでしたが、これは滅茶苦茶快適でいいですねw
プログラムは→SoulGemLedControl.zipに。
b3195.BMP
中身はこんな感じ。とりあえずSOPでぎりぎり入ります。MLFパッケージ版だともっと余裕があるとは思いますが・・。
b3193.jpg
本当はジャンク箱に入っていた加速度センサーも組み込むつもりでしたが、配線するため線を曲げたときにパッドを引っ張ってはがしてしまって\(^o^)/オワタ 0.4mmの単線UEWでやってたもんだから、線が堅くて曲げるときにパッドに力がかかってしまったのが敗因。やっぱり最近半田付けをほとんどやってなかっただけにダメですね。うーん。
b3194.jpg
というわけで、回路図には加速度センサーの残骸が残ってますが、LEDだけの場合は点線四角以外になります。プログラムにもADCの設定の残骸がありますが未テストです。ちなみに加速度センサーは千石電商で300円で手に入る安いものです。ただ、電源電圧がMax3.6Vですから、レギュレータで電源電圧を変換する必要はあります。
電源電圧はソウルジェムに使っている電池がアルカリボタン電池のLR41(1.5V)×3なので4.5Vなのですが、大体新品は1.5Vを微妙に超えています。実際、実測4.76VでしたのでMaxで4.8Vぐらいの電源は入るものとしておきます。LEDはVf=1.8Vのものを使いましたから、ATtinyの1ポートの絶対最大定格 40mAの範囲に収まる程度でドライブしています。今回は無難に30mAを目指して100Ωで電流制限です(4.8-1.8=3.0V,3.0V÷30mA=100Ω)。青色や青色を変換して点灯する白色、紫色などはVfは3.0Vに近いので、この電流制限抵抗はちょっとこれより低めです。
点灯はTimer1をPWMとして使ってここで光量を調整して、Timer0のオーバーフロー割り込みで定期的にPWMの比較一致値を変更して順繰りに変えて言ってます。使ったATTinyのエラッタかわかりませんが、COM1B1,COM1B0=11に設定すると、まぜかOC1BにPWM出力されません。10設定にすると動くので謎です。11のモードは、10のモードとOC1Bの出力論理が変わるだけのはずなんだけど違ったかな?
あと、動作をAVR simulatorで確認しようと思ったら、シミュレータだとタイマー割り込みが正常に動かないっぽいですね・・。最初、コードに誤りがあるものと思ってみてたら、間違いがどうしても見つからないので、実機に焼いてみたらすんなり動いたという。昔っからこんなもんだったっけかな?
そんなわけで、完成品はこんな感じで。

結構適当に作っていますが雰囲気は出ているかと(自画自賛w)。ちなみに動画は初めてPentax K-5の動画機能を使って撮影してみましたが、意外にうまく撮影できるもんですね。無駄にズームとかして遊んでしまったりw
でも春にはソウルジェムライト2という点滅するバージョンが出るみたいですので、あまり意味ないかも? ただ、おそらく自動点滅タイプのLEDにするだけだと思いますので、無駄にはならない・・かな?
posted by もろぼし☆らむ at 15:46| Comment(0) | TrackBack(0) | 電子工作

2009年05月10日

aitendo 96×64サイズ 16bitカラーOLED part2

折角静止画まで出しましたから、やっぱり動画を出したくなります。そんなわけでさくっと作成。対応AVIデータは無圧縮の96*64サイズのみです。簡単なフレームの選別はしてますが、変なモノをいれるとこけます。まぁ、ヘッダ解析をきちんとしなければいけないのですが、これが主目的でもないので、これ以上まともにはしませんw
再生するAVIファイルはSDカードに入れます。EVK1101の場合、SDカードはSPI接続ですので、そのまんまOLEDを一緒のバスにつなげるとSPIのバスを共用してしまうためにダブルバッファリングなどを用いた並列読み出しができないため、あまり高速化はできません。ただ、AVR32 UC3Bの場合はUSARTをSPIとしても使えますので、USART Tx,Rx,CLKをSPIのMOSI,MISO,SCKとして使えば、OLEDとSDカードで使用するSPIバスを物理的に分けられますから、両者をDMAを使うことにより、効率的に画面表示をすることも可能です。
さて、SDカードのファイルシステムはChaNさんのFatFsを使ってもいいですが、折角なのでフレームワークに入っている機能だけでやってみましょう。
AVR32の場合、フレームワークに入っているSDカードのコンポーネントは上位層のメモリ管理コンポーネントの配下にあります。同様のSPI接続のデータフラッシュ対応のコンポーネントも配下にあり、それらを個別のドライブとしてサポートすることが可能です。機能としてはFAT32,16,12とLFNは対応していますが、Unicodeはコード変換がきちんとはサポートされていません。
Exampleには、なぜかデータフラッシュの制御サンプルしかありませんが、SDカードを制御するようにするには、CONFIG\conf_access.hで以下のように設定すればいいようです。ちなみにLUN1はデータフラッシュに割り当てられています。

<conf_access.h>

#define LUN_2                ENABLE  //!< SD/MMC Card.
/** 省略 **/
/*! \name LUN 2 Definitions
 */
//! @{
#define SD_MMC_SPI_MEM                          LUN_2
#define LUN_ID_SD_MMC_MEM                       LUN_ID_2
#define LUN_2_INCLUDE                           "sd_mmc_spi_mem.h"
#define Lun_2_test_unit_ready                   sd_mmc_spi_test_unit_ready
#define Lun_2_read_capacity                     sd_mmc_spi_read_capacity
#define Lun_2_wr_protect                        sd_mmc_spi_wr_protect
#define Lun_2_removal                           sd_mmc_spi_removal
#define Lun_2_usb_read_10                       sd_mmc_spi_usb_read_10
#define Lun_2_usb_write_10                      sd_mmc_spi_usb_write_10
#define Lun_2_mem_2_ram                         sd_mmc_spi_mem_2_ram
#define Lun_2_ram_2_mem                         sd_mmc_spi_ram_2_mem
#define LUN_2_NAME                              "\"SD/MMC Card\""
//! @}


これでctrl_accessモジュールと繋がります。あとはSDカードライブラリを使う前に、自分でSDカードで使用するSPIのチャンネルの初期化を行っておきます。
と、これで動くかと思ったら、どうもSDカードのmountがNGになるときがあります。オシロで波形を確認しつつトレースしてみると、SDカードのコンポーネントの初期化部分に問題がありそうです。
SDカードを電源投入後に初期化するには、PowerOnしたあとで最初にCSをDeassertしたまま74CLK以上のクロックを入れる必要があるのですが、これをやっていないようですね。ただ、AVR32のSPI関連IPはCSをdeassertしたままクロックを出せないようなので、一度CSとCLKを通常の出力ポートのピンに設定して、自前でパタパタとクロックを作ってリセットする必要があります。取りあえず、以下のコードを作って、sd_mmc_spi_internal_init()とsd_mmc_spi_check_presence()に追加しておきます。

// for poweron reset.  @@myan
void sd_mmc_spi_poweron_reset(void)
{
  int i;

  spi_unselectChip(SD_MMC_SPI, SD_MMC_SPI_NPCS);  // unselect SD_MMC_SPI

  // GPIO pins used for SD/MMC interface
  static const gpio_map_t SD_MMC_SPI_GPIO_MAP =
  {
    {SD_MMC_SPI_SCK_PIN,  SD_MMC_SPI_SCK_FUNCTION },  // SPI Clock.
    {SD_MMC_SPI_NPCS_PIN, SD_MMC_SPI_NPCS_FUNCTION}   // Chip Select NPCS.
  };

  // generate cs=H & CLK 74clk
  gpio_set_gpio_pin(AVR32_PIN_PA17);
  for (i=0;i<100;i++) {
    gpio_set_gpio_pin(AVR32_PIN_PA15);        // CLK ON
    gpio_clr_gpio_pin(AVR32_PIN_PA15);        // CLK OFF
  }
  // re-Assign I/Os to SPI.
  gpio_enable_module(SD_MMC_SPI_GPIO_MAP,
                     sizeof(SD_MMC_SPI_GPIO_MAP) / sizeof(SD_MMC_SPI_GPIO_MAP[0]));
}


上記までやって、やっとSDカードとファイルシステムが安定して動作するようになりました。あとは、AVIファイルのmoviチャンク内にある00dbフレームのみを読み出ししつつ展開すれば、取りあえずは動きます。
たた、このままだとメインクロックが12MHzのままで動作させていますから遅いので、PLLをいじってもうちょっと高速化してみます。
以前取り上げたNGWに乗ってるAP7000と同様にUC3Bも内部でPLLを持っていますので、外部OSCのクロックを逓倍したクロックで60MHzで動作させることが可能です。ということで、PLLを逓倍してCPU,HSB,PBBが48MHz動作でPBA24MHzにしておきます。なお、AP7000と違ってUC3系ではHSBはCPUと同じクロックでしか設定できません。また、CPUクロックを30MHz以上にする場合には、内蔵フラッシュのアクセスウェイトを1ウェイトにする必要があります。
大体、この状態で18〜9フレーム/秒ぐらいです。SDカードの読み出しがsingle block readのみだったり、DMA使ってなかったりする手抜きコードでも、これだけ出れば上出来かな?
ここまで標準でライブラリが揃っていると、結構あっという間に作れてしまうのでモノグサにはいいですね。ちなみにこの動画対応も1日ぐらいしかかけてないです。まぁ、同期を取っていない手抜き再生なんでアレですが・・・
一応、実際に再生している動画→
再生テスト用のプロジェクト→ココ
ちなみに、動画を撮ってアップするのは初めてですw 先日入手したCASIOのEX-Z400で撮ってますけど、近接撮影で動画撮るのが難しいなぁ〜。他のカメラもこんなもんなのかな?
固定焦点なので、近接だとMFでフォーカス合わせてから撮る必要があるので面倒・・・
posted by もろぼし☆らむ at 00:28| Comment(0) | TrackBack(0) | 電子工作

2009年05月02日

aitendo 96×64サイズ 16bitカラーOLED

この前買ってきたaitendoの96*64のOLED(有機EL)を点灯させてみました。ベースボードも先日買ったAVR32のEVK1101です。でも、EVK1101をこういうのに使うのはアレかも。よーくEVK1101の回路図を見たら、空きポートが全くありませんw しょうがないので、取りあえず使いそうにないRS232CのCTSとRTSで使ってるポート(PB4,5)の0Ω抵抗を外して、コネクタ側で両方を直結するように変更。こういう用途にはSTK600を使うべきですね・・・。これでも足りないので、あとはI2CのSDAを拝借。
b595.jpgb596.jpg
EVK1101に載っているのはAT32UC3B0256なんで、外部SRAM IFはないので、OLEDとの接続は必然的にSPIになります。UC3AだとSDRAMとかも繋がるメモリーインターフェイスがあるので楽ではありますが、ピン数が増えます。AVR32の場合、SPIのインターフェイスはDMAが使えるので、ちゃんと設計すればSPIでも結構早いのが作れると思いますが、今回は実験なのでお手軽設計。
このOLEDに載ってるSSD1332ではDC-DCコンバータ機能も載っているので、1つだけ使う分には外付けでDC-DCコンバータのICを付けなくても動作させることができます(Lとかの外部部品は必要)。今回は、本番で使うときには2個同時に動かすので使いませんから、外付けのDC-DCコンで供給するために使わないことにしました。
回路図はこれだけ。
b598.bmp
まぁ、アプリケーションノートをみて書いてますのでアレですが、SSD1332のメーカーの出してるデータシートに載ってる回路とパネルメーカーの出してる回路は微妙に違います。が、端子機能を読んでみるとICメーカーの方が正しそうw しかも回路パラメータもなんか怪しい。うーん。
そんなわけで、一応、ICのデータシートに則って定数は決めてます。
パワーオンシーケンスは3.3Vが先で15Vは後です。オフは逆。そんなわけで、DC-DCコンにはFETでON-OFF機能はつける必要があります。もちろん、リセット時はオフになるように。まぁ、適当に作る分にはさほど問題ないですが、手順を考慮しておかないと、いきなりDDが死ぬときがあるので、ちゃんと作りましょう。でも、そういうことを気にする割には、DC-DCコンの出力波形見たら、200mVぐらいのリプル乗ってます。部品がありあわせなんで、ESRが低くなかったり耐圧が16Vだったりとwアレなので、ちゃんとしたコンデンサを最終段に入れないとだめですね。
制御ソフトはかなりお手軽。AVR32ではフレームワークが使えますので、取りあえずプロジェクトを作るときにテンプレートで作るモードで作って、あとで使う機能を追加していきます。そうすると、その追加機能のライブラリ関数が使えるようになります。今回は、SPI,GPIO,RTC,INTC,PMを使用。でも、普通に作るとなぜかGPIOの機能を入れるとビルドが通らないw いろいろ試行錯誤したら、プロジェクトでincludeの順位をGPIOを先にしておかないとビルドが通らないっぽい。なんじゃそりゃ?w
あとは、適当にフレームワークの関数をサンプルシーケンスにしたがって呼び出して終わり・・・のはずが、トラップ。横着してCSをずーっとLowに入れっぱなしだったんですが、これやると動きません。どうもC#/Dの切り替わりはCSも見てるようなので、CSをde-assertしてから切り替えないとまずそうです。一度でもde-assertすればちゃんと切り替わるみたい。ちなみにこのOLEDに書き込むデータはB5G6R5です。WindowsのbmpとはR,Bが逆なので注意。
そんなわけで、制御ソフトのサンプルを提示→ココ
ちょっと発色が悪いかな? アプリケーションノートに載ってるコントラストパラメータではなくて、ちゃんと調整する必要がありそうですね。
あとはEVK1101のSDカードスロットをつかえるようにしましょうか。実はこれもフレームワークにあるんですぐできる?(ぉ
あとは、先日買ったインターフェイスのARM7基板を組み立て。手持ちであったPARTNER-Jetとつなげてみましたが動きました。WinARM環境しか駄目ですが・・・。このICEってOCDのドライバがないから、あんまり汎用性は高くないのでアレですね。あと、JTAG Clockは自動設定だと駄目で、500KHzぐらいに強制設定する必要があります。あと、当たり前ですが内部フラッシュの書き換えはできないので、これはFlashMagic経由になるでしょうか。
b597.jpg
posted by もろぼし☆らむ at 12:31| Comment(0) | TrackBack(0) | 電子工作