LEDマトリクスを2枚使ったときの電源ケーブルまわりを整理してみた
はじめに
前回の記事にてLEDマトリクスを2枚用いた文字の横スクロール表示を実現しました。
kuracux.hatenablog.jp
こちらの記事の最後にも触れましたが電源ケーブルまわりについて不便だなと思うことがあったので、その解消方法について触れていきたいと思います。
困った点
上記の記事の内容を実現した際に困ったこととして、コンセントの使用数が多いことが挙げられます。というのもRaspberry Pieで1つ、LEDマトリクスで2つのコンセントを使用するため、実現するだけで計3つのコンセントが必要になります。これはちょっと多いなと思ったので、LEDマトリクスのコンセントの使用数を2つから1つに減らしたいと思います。
実現方法
こちらの記事より5V4AのACアダプターに全パネルを接続すれば良いということだったので、そのように進めていきます。
完成品
下記のツイートのようになります。2つのLEDマトリクスが1つの電源ケーブルから電源供給されています。
LEDマトリクスの後ろの部分が綺麗になりました pic.twitter.com/hzgRrpEZye
— クラクス (@kuracux) 2019年5月19日
準備物
前回の記事に追加して以下のものが必要です。なお、前回まで使用していた電源まわりの準備物は全て不使用となります。
- 5V4AのACアダプター
SUCCUL ACアダプター 5V 4A 大手メーカーOEM社製品 センタープラス スイッチング式 最大出力20W 出力プラグ外径5.5mm(内径2.1mm)PSE取得品
- 出版社/メーカー: サクル株式会社
- メディア: エレクトロニクス
- この商品を含むブログを見る
- ビニールテープ
- 出版社/メーカー: ニチバン
- メディア: オフィス用品
- この商品を含むブログを見る
- テスター
Crenova デジタルマルチメーター 電圧・電流・周波数・抵抗・導通測定テスター
- 出版社/メーカー: Crenova
- メディア: Automotive
- この商品を含むブログを見る
- ニッパー(自宅にあったものを使用)
実施手順
1. ACアダプターの端子を切断して、ニッパーでビニルを剥ぎます
2. LEDマトリクスに付属している電源ケーブルの丸形端子を切断し、こちらもニッパーでビニルを剥ぎます
3. ACアダプターのプラスとマイナスがどちらであるかをテスターを使って調べます。
4. ACアダプターと電源ケーブルを接続します。3にて黒のワニ口クリップに繋いでいた線と電源ケーブルの黒い線を、赤のワニ口クリップに繋いでいた線と電源ケーブルの赤い線をビニールテープで繋ぎました。
5. 完成品のようにLEDマトリクスと接続して完成です。
おわりに
これまであまりやったことがない作業だったこともあり不安でしたが無事に出来ました。使用するコンセントが1つ減った上に配線も綺麗になったので良かったです。
16×32のLEDマトリクスを2つ繋げて16×64にしてみた
はじめに
前回、16×32のLEDマトリクスを使って文字の横スクロールを実現しました。
kuracux.hatenablog.jp
しかしLEDマトリクス1枚だけでは一度に表示される文字数が2文字と少ないです。
日本語表示も出来ました、いい感じですね。 pic.twitter.com/aSCV04sVDT
— クラクス (@kuracux) 2019年4月27日
そこで今回は16×32のLEDマトリクスを2つ繋げて16×64にする方法を説明します。
準備物
前回の記事に追加して以下のものが必要です。主にパネルとその電源まわりのものとなります。
- 16x32 RGB LED マトリックスパネル
- 2.1mm標準DCジャック⇔スクリュー端子台
- スイッチングACアダプター 5V2A
- ブレッドボード・ジャンパーワイヤ(オス-オス) 10cmセット
配線
上記パネル購入時に付属されていた制御用ケーブルで接続するだけです。
電源ケーブルは前回同様の接続で良いです。
実行
前回記事のコマンド例のオプションにある 「--led-cols=32」を 「--led-cols=64」 に変えるのみです。
sudo ./scrolling-text-example --led-no-hardware-pulse --led-rows=16 --led-cols=64 -s 3 -l 1 -f bdfファイルのパス -C 0,206,209 表示する文字列
おわりに
すでに1つのパネルで表示することが出来ている場合は
- 制御ケーブルを繋ぐ
- コマンドのオプションを変える
だけで2つのパネルを表示すること出来るので実現しやすいと思います。表示領域が増えるのは見やすくていいですね。
一方で、ここまで実現した際に問題点が1つ浮上します。それは電源ケーブルまわりについてです。次回はそちらに関して触れていきたいと思います。
ラズパイとLEDマトリクス(16×32)で電光掲示板を作ってみた
はじめに
駅構内にある電光掲示板のような形で何らかの情報を流し続けられるといいなと思い、ラズパイとLEDマトリクスを使った日本語文字列の横スクロール表示を実現してみました。
先駆者が数多くいるため、参考にした記事を用いたまとめのような形になってしまいますが、参考になればと思います。
準備物
- Raspberry Pi 3 Model b+
- 16x32 RGB LED マトリックスパネル
- 2.1mm標準DCジャック⇔スクリュー端子台
- スイッチングACアダプター 5V2A
- ブレッドボード・ジャンパー延長ワイヤ(メス-メス) 15cm黒 (10本入) ×2セット
- ブレッドボード・ジャンパーワイヤ(オス-オス) 10cmセット
配線
- 電源⇔LEDマトリクス
接続の流れとしては、ACアダプター→DCジャック→ジャンパーワイヤ(オス-オス)→パネル付属の端子です。以下の記事を参考にしました。
https://learn.adafruit.com/connecting-a-16x32-rgb-led-matrix-panel-to-a-raspberry-pi/wiring-the-display
- LEDマトリクス⇔ラズパイ
当初はadafruitの記事通りに配線しましたが表示されませんでした。
https://learn.adafruit.com/connecting-a-16x32-rgb-led-matrix-panel-to-a-raspberry-pi/wiring-the-display
そのため、以下の記事の図7を参考にしました。
www.buildinsider.net
サンプルの実行
以下の記事の制御ライブラリの導入から参考にしました。今回はPythonを使用できる設定については省略しております。今回の目的は文字列の表示なので、テキストのスクロールが出来ると良いです。
こちらの記事では日本語文字に対応するには画像変換が必要であるとありますが、以下の手順を踏めば文字列のままで日本語を表示することが可能です。
日本語の表示
流れとしては、下記のとおりです。
- 日本語のフォントをダウンロードする(ttfファイル)
- フォントの変換(ttfファイル→bdfファイル)
- 変換したフォントを利用して、表示する
1と2に関しては以下の記事を参考にしました。
holybea.com
3に関しては文字列表示時のフォントオプションについて、今回変換したbdfファイルを指定することで表示可能となります。
以下、コマンド例です。
sudo ./scrolling-text-example --led-no-hardware-pulse --led-rows=16 --led-cols=32 -s 3 -l 1 -f bdfファイルのパス -C 0,206,209 表示する文字列
おわりに
今回はラズパイとLEDマトリクスを使った日本語文字列の横スクロール表示の実現方法について、参考にした記事を基にまとめてみました。16×32のパネルを使ってみて思ったのが「もっと横長にしたい!」でした。また、何らかのAPIを使って常に情報を表示できる仕組みがまだ実現できていないので、そちらについても進めていきたいです。
M5Stackでおみくじを作ってみた
はじめに
年のはじめの運試しとして毎年神社でおみくじを引いています。
そんなおみくじをM5Stackで実現したので本記事にて紹介します。
完成品
あけましておめでとうございます。
— クラクス (@kuracux) 2018年12月31日
新年の運試しをしたいと思い、おみくじを作りました。本体を振ることで結果が変わります。M5Stack Grayを用いて実現しました。 pic.twitter.com/E434VYYFcH
動画の通り、1回目は吉、2回目は中吉という結果が得られました。好きなだけおみくじが引けて良いですね。
準備物
- M5Stack Gray
- 出版社/メーカー: スイッチサイエンス
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
- microSDカード
- 出版社/メーカー: トランセンド・ジャパン
- 発売日: 2015/10/02
- メディア: Personal Computers
- この商品を含むブログ (1件) を見る
原理
表示する画面分の画像を用意して、ボタン操作に応じて画像を切り替えております。
M5Stackの画面サイズは320×240ですので、ペイントにて画面サイズを指定後、必要となる画像を作成しました。
今回は、以下の7枚の画像を使用しております。
(フォルダ構成およびファイル名は下記のスケッチ例をもとに命名してください)
スケッチ例
初期値をランダムで設定し、振ることでその値が変わり、表示される画像も変わります。
振った際の処理についてはこちらの記事をご覧ください。
kuracux.hatenablog.jp
#include <M5Stack.h> #include "utility/MPU9250.h" MPU9250 IMU; bool leftFlag = false; //左に動いたことを保持するフラグ bool rightFlag = false; //右に動いたことを保持するフラグ bool omikujiFlag = false; int th = 80; int count; void setup(){ Serial.begin(115200); M5.begin(); Wire.begin(); M5.Lcd.setBrightness(50); M5.Lcd.drawJpgFile(SD, "/pictures/home.jpg"); byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); IMU.calibrateMPU9250(IMU.gyroBias, IMU.accelBias); randomSeed(analogRead(0)); } void loop(){ if(M5.BtnA.wasPressed()){ omikujiFlag = true; count = random(0,5); M5.Lcd.fillScreen(BLACK); M5.Lcd.drawJpgFile(SD, "/pictures/omikuji.jpg"); }else if(M5.BtnB.wasPressed()){ if(omikujiFlag){ resultOmikuji(); omikujiFlag = false; } }else if(M5.BtnC.wasPressed()){ omikujiFlag = false; M5.Lcd.fillScreen(BLACK); M5.Lcd.drawJpgFile(SD, "/pictures/home.jpg"); } if(omikujiFlag){ shake(); } M5.update(); } void resultOmikuji(){ M5.Lcd.fillScreen(BLACK); String s = "/pictures/"+String(count)+".jpg"; M5.Lcd.drawJpgFile(SD, s.c_str()); } void shake(){ if (IMU.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01){ IMU.readGyroData(IMU.gyroCount); // Read the x/y/z adc values IMU.getGres(); IMU.gz = (float)IMU.gyroCount[2]*IMU.gRes; } IMU.delt_t = millis() - IMU.count; if (IMU.delt_t > 100){ int accel = (int)(IMU.gz); if(accel < -th){ if(leftFlag){ //左に振る→右に振るの後の処理 count = (count + 1) % 5; }else{ rightFlag = true; } }else if(accel > th){ if(rightFlag){ //右に振る→左に振るの後の処理 count = (count + 1) % 5; }else{ leftFlag = true; } }else{ leftFlag = false; rightFlag = false; } IMU.count = millis(); } }
所感
- おみくじを振ってる感があまりない
理由の1つとしては振った時のジャラジャラ音がないことが考えられます。よりリアリティを求めるのであれば、実際の体験に近づける工夫をしようと思いました。
- 振った際に値が変わる処理はなくても良い
おみくじ開始時にランダムで値が決まり、なおかつユーザがその値を知らないのであれば、振る動作によって値が変わる処理を入れてもあまり意味はありません。
確かに振った際の動作で結果が変わるという処理は「おみくじらしさ」があるかもしれませんが、あくまでそれは開発者側の視点であって、ユーザの視点で考えると不要だと感じました。
おわりに
今回はM5Stackでおみくじを作りました。
個人的には、このおみくじではまだまだM5Stackを活かしきれていないなと感じておりますので、その辺りも考えた上で作り上げていければいいなと思います。
クレーンゲームにハマって3ヶ月が経ったのでその振り返り
はじめに
YouTubeにて様々なクレーンゲームの動画を見て「私もあんな風に取れるようになりたい!」と思い、この3ヶ月で主にフィギュアとぬいぐるみをゲットを目指して頑張っていました。
本記事ではその結果と振り返り、そして今後の方針をまとめたいと思います。
前提
- 私はクレーンゲームにハマる以前は片手で数えられるくらいしか景品を取ったことがありません。挑戦自体は何回もしていましたが、景品を取れたことはほぼなかったため、「どうやっても取れないんだろうな」と思っていました。
- ゲットすること自体を目標にしていたため、基本的にお金に関してはかなりかかっています。もちろん数百円で取れるケースもありましたが、設定ミス等、運が良い場合がほとんどです。
- 本記事は取り方のテクニックに関しては触れず、振り返りをメインにしたいと思います。クレーンゲームのテクニックはYouTubeにて先人たちの動画がたくさんありますので、そちらを参考にしてください。
結果
- フィギュア:20体
- ぬいぐるみ:6体
- クッション:1個
- かかった金額:約5.6万円+α(フィギュアとぬいぐるみで平均約2千円、クッションで約4千円)
振り返り
- 諦めない方針は良かった
元々クレーンゲームにあまり良い思い出がなかったため「どうやっても取れないだろうな」と思っていましたが、「お金をかければ取れる!」と思えるようになったのは大きいと思います。どうしても無理な場合(アームパワーがとても弱い等)を除き、基本的にはお金を気にせず遊んでいました。取れることで自信になり、次も頑張ってみよう!と思えたため、この方針は良かったと思います。
- 最初に決めた取り方を変えないように
「こうやって取るぞ!」と最初に取る方法を決めながらも、途中で「この方法に切り替えよう」と変えてしまい、結果として余分に手数がかかってしまうことが多々ありました。上手な人であれば正しい判断をした上で器用に切り替えることができるのだと思いますが、私は知識や経験が少なく、あまり上手くできなかったため、最初に決めた方法で突き進むほうが良いと思いました。
- もし諦めるならお早めに
アームのパワー等、クレーンゲームの設定によってはどうやっても無理だろうと思うものもあります。そういった場合はどうしても欲しいものを除き、基本的に諦めたほうが良いです。
この出費を抑えることが特に重要だと思っています。かかった金額の+αにあたりますが、基本的には損失です。設定の確認に手間取る、または難しい設定なのに出来ると判断して突き進んでしまうと、諦めたくてもここまで使っちゃったし・・・と思って、なかなか諦められなくなり、結果としてかなりのお金を使うことになってしまいます。諦めることには勇気がいるため、早い段階ですっぱりと諦められるように、なるべく最小手数で、そして正確に判断できるようにしたいです。
- 経験があまり蓄積されていない
フィギュアであれば橋渡しやリングを引っ掛けるもの、ぬいぐるみであれば3つ爪の確率機等、対象によってある程度のパターンは存在するため、あるケースで使えた方法が別のケースでも使えるといったことは往々にしてあると思います。直感的なものは少しずつ身についているとは思いますが、この時の選択は果たして正解だったのか?別の方法があったのではないか?等を確認し、次の機会に活かすためにも記録として残して振り返るべきだと思いました。
悩み
気づけば多くのフィギュアをゲットしていたため、置き場に困り始めております。本当に欲しいものというよりも、取れそうなものにターゲットを絞っていたこともあり、どんどんと数が増えていきました。メルカリに出品することも考えましたが、送料と手間を考えるとあまりメリットがないように感じております。近くで売れるところを探したほうが良さそうなのですが、あまり詳しくないため、一度調べてみたほうが良さそうかなと思いつつあります。
まとめと今後の方針
この3ヶ月でクレーンゲームに対する心境として「どうせ取れない」から「諦めずに頑張れば取れる」へと変化しました。
しかし、お金をかけまくるというやり方は後々大変なことになってしまうので、「使用金額を減らしつつ、これまで通り取ること」を次の目標として考えています。
そのための今後の方針については以下の2点です。
- 余分な出費を減らすために、諦める際の判断をこれまでよりも早めにし、無駄な手数をかけないことを意識する
- クレーンゲームで遊ぶ際には動画を撮り、あとから振り返る
2つ目については、以下のものを購入しましたので、活用していきたいと思います。
【E-COAST】首掛けスマホスタンド スマホホルダー 3-5.5インチ携帯汎用スタンド ペンダント式 ハンズフリー 自撮りツール 携帯便利 アウトドアに最適 (ブラック)
- 出版社/メーカー: E-COAST
- メディア: エレクトロニクス
- この商品を含むブログを見る
【Rails+devise】サインアップ・パスワード変更画面の入力チェックエラー時のルーティングについて
はじめに
Ruby on Railsにてユーザ認証系の処理を実装する際に使用されるgemとしてdeviseがあります。
github.com
本記事ではサインアップおよびパスワード変更画面にて入力チェックエラーがある際のルーティングについて、発生した問題とその解決方法について記載したいと思います。
問題
サインアップおよびパスワード変更画面にて入力チェックエラーを引き起こすと下記のパスに遷移します。
- サインアップ画面:'/users'
- パスワード変更画面:'/users/password'
遷移後、ブラウザの更新ボタンを押すとエラーが発生します。
原因として、GETメソッドにて上記のパスが定義されていないことがあげられます。
解決方法
route.rbに下記を追加することで、GETメソッド時の遷移先パスを定義します。
devise_scope :user do get '/users', to: 'devise/registrations#new' get '/users/password', to: 'devise/passwords#new' end
おわりに
ルーティングの設定によるものだったので気をつけようと思いました。
また、下記に使用したバージョンと検証用アプリケーションの構築方法を記載しておきます。
同様のエラーに直面した際の参考になればと思います。
検証用アプリケーション
こちらの記事を参考に構築しました。「タスク用CRUD画面の作成」の手前までで実施しております。
blog.freedom-man.com
AWS Cloud9でCapybara+Selenium+Chrome設定時のエラーとその対処法について[ Everyday Rails 6章 ]
はじめに
「Rails チュートリアル」にて開発環境としてAWS Cloud9を使っていたことから、「Everyday Rails - RSpecによるRailsテスト入門」を進める際にも継続してAWS Cloud9を利用しています。
しかし、6章の「JavaScriptを使った操作をテストする」という項目で記載通りにSelenium+Chromeの設定をし、スペックを実行しようとしてもエラーが出てしまい実行することが出来ませんでした。
本記事では、私が直面したエラーメッセージとその対処法を記載したいと思います。
対象
- AWS Cloud9でRuby on RailsおよびRSpecを使用している
- 下記、設定は完了している
spec/rails_helper.rbの以下の行のコメントアウトを外している
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
spec/support/capybara.rbに以下を記述
Capybara.javascript_driver = :selenium_chrome
Gemfileに'chromedriver-helper'を追加
エラーメッセージとその対処法
その1
Selenium::WebDriver::Error::UnknownError: unknown error: cannot find Chrome binary
Amazon LinuxにChromeが入っていないことが原因だと考えられます。
下記コマンドを実行し、インストールを行ないましょう。
curl https://intoli.com/install-google-chrome.sh | bash
参考
https://www.t4traw.net/blog/2018/03/awsamazon-cloud9環境でheadless-chromeを使う/
その2
Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: exited abnormally
spec/support/capybara.rbの記述内容を以下のように修正します。
Capybara.javascript_driver = :selenium_chrome_headless
Capybara.javascript_driver = :selenium_chromeでは実際にChromeを開いてテストしますが、AWS Cloud9ではそれが出来ないのだと思われます。
そのため、ヘッドレスモードを使ってテストをするように設定することで解決します。
その3
NameError: uninitialized constant Selenium::WebDriver::Chrome::Options
「::Selenium::WebDriver::Chrome::Options」はselenium-webdriverのバージョン3.4.1にて追加されたため、それ以上のバージョンにしなければなりません。Gemfileのselenium-webdriverのバージョンを3.4.1以上に設定し、bundle installを実行しましょう。