<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
	<title><![CDATA[ タグ「Arduino」を含む投稿［6件］ - でんげき☆ Network Service ]]></title>
	<link>https://room.dengeki.ne.jp/tegalog.cgi</link>
	<description><![CDATA[ Raspberry Pi 4 で運用実験中 ]]></description>
	<language>ja</language>
	<copyright>Copyright 2025</copyright>
	<lastBuildDate>Thu, 05 Jun 2025 14:05:45 +0900</lastBuildDate>
	<generator><![CDATA[ <!-- てがろぐ Version: -->Powered by <a href="https://www.nishishi.com/cgi/tegalog/" rel="noreferrer" target="_top">てがろぐ</a> Ver 4.4.5 ]]></generator>
	<!-- BEGIN ENTRIES -->
	<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを… ]]></title>
	<description><![CDATA[ (M5) ATOM Lite でまぁまぁスマートなリモコンを作ろう<br /><img class="embeddedimage nolisted" width="400" height="400" src="https://room.dengeki.ne.jp/images/202307171653523-admin.png" alt="202307171653523-admin.png"><br />　<br />今年の初めに…かれこれ 18 年くらい住んでたボロアパートをぶっ壊すってんで追い出されて今度は高級マンションの最上階に引っ越してきました！(&gt;_&lt;)ｗ　そんな高級マンションには…ご入居前リフォームで 2022 年製のエアコンに交換されていたのはいいんだけどちょっと使いづらいんですよね<br />何が使いづらいかっていうと…リモコンでのタイマーセットが不便なんですよ　以前のボロアパートで使ってたエアコンはリモコンに RTC(時計) が実装されていたのでタイマーセットも絶対時間で行うことができていたんですよ　それがご新居のエアコンのリモコンには RTC(時計) が付いてないもんだでタイマーセットしようとすると「7時間後」って感じの相対時間での設定になるんですよ　不便ですよね(-_-；)<br />そんな訳なんでもちっとタイマーセットしやすいリモコンをどうにかするっていうか…せっかくなんでスマホちゃん等と連動させて絶対時間でエアコンの On/Off を制御できるリモコンを作ってみることにしました<br /><br />昨年に「安いじゃん！」って思って買っておいた (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> が手元にあるんでそれを使うことにしました　今買うなら (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/8778" rel="noopener noreferrer" target="_blank">ATOMS3 Lite</a> &nbsp;のほうがいいのかも知れないけど未確認です汗<br />それと CGI っていうか Perl が使える Web サーバが必要です　今回は Raspberry Pi OS にセットアップした Apache を使ってるけど…プロバイダなどで供されている CGI の使える Web サーバでも大丈夫だと思います<br /><br />そうそう今回使う (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> には RTC が載っていません　それ即ち時計が使えないって事なんでその辺をどうにかしなければなりません<br />そこで一定時間(今回は約30秒)ごとに Web サーバにアクセスして…アクセスされた Web サーバが現在時刻(とエアコン設定内容)を返しそれにより時刻の判定を行うようにしました<br /><br />　　：<br /><br />それでは最初に (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> の方から初めていきましょう　開発環境は Linux っていうか Snap 版の Arduino IDE を使いました　まぁ Arduino IDE であれば Windows 版とかでも同じく使えるとは思いますが未確認です汗　そんな Arduino IDE の設定は <a class="url labeledlink" href="https://room.dengeki.jp/tegalog.cgi?postid=24" rel="noopener noreferrer" target="_blank">M5StickC Plus の開発環境を構築する</a> が参考になると思います　ボードを追加した後に「M5Stack-ATOM」を設定すれば ok です<br /><br />お次は (M5) <a class="url labeledlink" href="https://www.switch-science.com/products/6262" rel="noopener noreferrer" target="_blank">ATOM Lite</a> 向けのライブラリのインストールですかね　これは「<span class="decorationC" style="color:red;">ツール</span>」メニューから「<span class="decorationC" style="color:red;">ライブラリを管理…</span>」を選んで検索窓に必要なキーワードを入れて出てきたものをインストールってする感じですかね<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.ne.jp/images/20230717165352-admin.png" alt="20230717165352-admin.png"><br />「<span class="decorationC" style="color:red;">m5atom</span>」と入れて出てきた「M5Atom」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.ne.jp/images/202307171653522-admin.png" alt="202307171653522-admin.png"><br />「<span class="decorationC" style="color:red;">irremoteesp8266</span>」と入れて出てきた「IRremoteEsp8266」をインストールする<br /><br /><img class="embeddedimage nolisted" width="1000" height="562" src="https://room.dengeki.ne.jp/images/202307171653521-admin.png" alt="202307171653521-admin.png"><br />「<span class="decorationC" style="color:red;">heatpumpir</span>」と入れて出てきた「HeatpumpIR」をインストールする<br /><br />これでライブラリ類の準備も完了ですかね　それではコードを見ていきましょう…っていうか手探りの「どうにか動く」テスト的なものだったのが意外と問題なく動いてしまって「あーなんか書き直すのもめんどくさいなー」って気分が昂ぶってきたんでそんなテスト的なものをそのまま載せています　動作未保証なのはもちろんとして…諸々をきちっと書き直して使ってください　それだけが私の望みです汗<br /><br />　　：<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;include &lt;M5Atom.h&gt; // Atom のヘッダファイルを準備<br />&#35;include &lt;WiFiMulti.h&gt;<br />&#35;include &lt;HTTPClient.h&gt;<br />&#35;include &lt;MitsubishiHeatpumpIR.h&gt;<br /><br />const char* url = &quot;http://user:pass@hoge.orz/remocon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi_ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi_pass&quot;; &nbsp;// パスワード<br /><br />const uint16_t kIrLed = 12; // 赤外線 LED 送信用のポート番号<br />IRSenderBitBang irSender(kIrLed); // 赤外線LEDが接続されているピン番号<br />HeatpumpIR *airCon = new MitsubishiFDHeatpumpIR(); &nbsp;// 三菱エアコンのインスタンス<br /><br />// FastLED ライブラリの設定(CRGB構造体)<br />CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {<br />&nbsp; return (CRGB)((r &lt;&lt; 16) | (g &lt;&lt; 8) | b);<br />}<br /><br />WiFiMulti WiFiMulti; &nbsp;// Wi-Fi を使いたい<br /><br />void setup() {<br />&nbsp; Serial.begin(115200);<br />&nbsp; Serial.println(&quot;&quot;);<br /><br />&nbsp; M5.begin(true, false, true); &nbsp;// 本体初期化(UART有効, I2C無効, LED有効)<br />&nbsp; M5.dis.drawpix(0, dispColor(0, 0, 0)); &nbsp;// LED全消灯(赤, 緑, 青)<br /><br />&nbsp; WiFiMulti.addAP(ssid, password); // 「SSID」と「パスワード」を設定しておく<br />&nbsp; Serial.print(&quot;Fi-Fi Connecting.&quot;);<br />}<br /><br />void loop() {<br />&nbsp; while (WiFiMulti.run() != WL_CONNECTED) {<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;.&quot;);<br />&nbsp;&nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 0)); &nbsp;//LED(赤)<br />&nbsp;&nbsp; &nbsp;delay(500);<br />&nbsp; }<br />&nbsp; Serial.print(&quot;ADDR: &quot;);<br />&nbsp; Serial.println(WiFi.localIP());<br /><br />&nbsp; M5.dis.drawpix(0, dispColor(20, 20, 20)); // LED(白)<br /><br />&nbsp; HTTPClient http;<br />&nbsp; http.begin(url);<br />&nbsp; Serial.print(&quot;GET: &quot;);<br />&nbsp; int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得<br />&nbsp; Serial.println(httpCode);<br />// &nbsp;Serial.println(http.errorToString(httpCode));<br /><br />&nbsp; if (httpCode &gt; 0) {<br />&nbsp;&nbsp; &nbsp;String htdoc = http.getString(); &nbsp;// 取得したファイルの内容<br />&nbsp;&nbsp; &nbsp;Serial.println(htdoc);<br /><br />// &nbsp;YYYY/MM/DD HH:YY:MM(WDAY)\ts?,HH:MM e?,HH:MM m?<br />// &nbsp;現在年/月/日 時:分:秒(曜日)\t開始フラグ,時:分 終了フラグ,時:分 モード<br />&nbsp;&nbsp; &nbsp;String now_hour = htdoc.substring(11, 13); &nbsp;// 現在時を取得<br />&nbsp;&nbsp; &nbsp;String now_min = htdoc.substring(14, 16);&nbsp; &nbsp;// 現在分を取得<br /><br />&nbsp;&nbsp; &nbsp;String st = htdoc.substring(25, 27);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 開始フラグを取得<br />&nbsp;&nbsp; &nbsp;String ed = htdoc.substring(34, 36);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// 終了フラグを取得<br /><br />&nbsp;&nbsp; &nbsp;String st_hour = htdoc.substring(28, 30);&nbsp; &nbsp;// 開始時<br />&nbsp;&nbsp; &nbsp;String st_min = htdoc.substring(31, 33);&nbsp; &nbsp; // 開始分<br /><br />&nbsp;&nbsp; &nbsp;String ed_hour = htdoc.substring(37, 39);&nbsp; &nbsp;// 終了時<br />&nbsp;&nbsp; &nbsp;String ed_min = htdoc.substring(40, 42);&nbsp; &nbsp; // 終了分<br /><br />&nbsp;&nbsp; &nbsp;String md = htdoc.substring(43, 45);&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;// モードを取得<br /><br />&nbsp;&nbsp; &nbsp;if (st == &quot;s1&quot; && now_hour == st_hour && now_min == st_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (md == &quot;m1&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Cool&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 0, 255)); &nbsp;//LED(青)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else if (md == &quot;m2&quot;) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Hot&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(255, 255, 0)); &nbsp;//LED(黄)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_HEAT, FAN_1, 16, VDIR_DOWN, HDIR_AUTO); // 暖房<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.println(&quot;Dry&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; M5.dis.drawpix(0, dispColor(0, 255, 0)); &nbsp;//LED(緑)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; airCon-&gt;send(irSender, POWER_ON, MODE_DRY, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 除湿<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;if (ed == &quot;e1&quot; && now_hour == ed_hour && now_min == ed_min) {<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.println(&quot;--- Stop ---&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;M5.dis.drawpix(0, dispColor(255, 0, 255)); &nbsp;//LED(紫)<br />&nbsp;&nbsp; &nbsp; &nbsp;airCon-&gt;send(irSender, POWER_OFF, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 電源 Off<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp; } else { &nbsp;// ファイルの取得に失敗している<br />&nbsp;&nbsp; &nbsp;Serial.println(&quot;Error&quot;);<br />&nbsp; }<br /><br />&nbsp; delay(30000);<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">remcon.ino</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />※デバッグ用のシリアル通信のアレが残っているんで実稼働時には消したほうがいいかも知れないです<br /><br />冒頭の <span class="decorationC" style="color:green;">&#35;include &lt;MitsubishiHeatpumpIR.h&gt;</span> は…まぁ見ての通り三菱社製のエアコン制御をする時に使うものです　これが他社製であれば<br /><span class="decorationC" style="color:green;">&#35;include &lt;DaikinHeatpumpIR.h&gt;</span> &nbsp;// ダイキン社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;FujitsuHeatpumpIR.h&gt;</span> &nbsp;// 富士通社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;HitachiHeatpumpIR.h&gt;</span> &nbsp;// 日立社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;PanasonicHeatpumpIR.h&gt;</span> &nbsp;// パナソニック社製<br /><span class="decorationC" style="color:green;">&#35;include &lt;ToshibaHeatpumpIR.h&gt;</span> &nbsp;// 東芝社製<br />こんな感じになるんじゃないかと思います(未確認)　詳しくは Aruduino IDE の関連フォルダ Arduino/libraries/HeatpumpIR/ を眺めてみるといいかと思います<br /><br />　　：<br /><br />データ(と時間)を取ってくる Web サーバの設定と… Wi-Fi 接続に関する設定を行います<br /><span class="decorationC" style="color:green;">const char* url = &quot;http://user:pass@hoge.orz/remcon/read.cgi&quot;; // 現在時刻＆設定内容の場所<br />const char* ssid = &quot;WiFi-ssid&quot;; &nbsp;// SSID<br />const char* password = &quot;WiFi-pass&quot;; &nbsp;// パスワード</span><br />保安上っていうか恐らくベーシック認証なりをかけて運用すると思うのですが…その際に ID とパスワードの入力を自動化しておかねばなりません　そんなときは <span class="decorationC" style="color:red;">http://user:pass@hoge.orz/remcon/read.cgi</span> って感じで URL の前に「<span class="decorationC" style="color:red;">user:pass@</span>」を付ければ自動で認証してくれます　この書き方は一般的なブラウザでも(警告が出るかもだけど)使えます<br />その次に Wi-Fi の SSID とパスワードの設定を行います　上記のベーシック認証と併せて平文のパスワードを記すことになるので取り扱いには十分注意してください<br /><br />　　：<br /><br /><span class="decorationC" style="color:green;">HTTPClient http;<br />http.begin(url);<br />int httpCode = http.GET(); &nbsp;// GET メソッドでファイルを取得</span><br />Wi-Fi 接続が確立したら目的のサーバからデータを取ってきます　後でも説明しますが…ここで得られるデータは次のようになっています<br /><br /><span class="decorationC" style="color:red;">YYYY/MM/DD HH:YY:MM(WDAY)&#91;タブ(\t)&#93;s?,HH:MM e?,HH:MM m?</span><br />&#91;タブ(\t)&#93; の前半がアクセスした時点での日時<br />&#91;タブ(\t)&#93; の後半がエアコンの開始/終了の時刻とモードを指しています<br />例えば <span class="decorationC" style="color:blue;">12 時 34 分</span>に作動させたい場合は <span class="decorationC" style="color:red;">s1,12:34</span> となります　その次が <span class="decorationC" style="color:red;">e1,23:45</span> だったら <span class="decorationC" style="color:blue;">23 時 45 分</span>に電源を切る動作となります　これが <span class="decorationC" style="color:red;">s0</span> もしくは <span class="decorationC" style="color:red;">e0</span> だった場合は何も動作しないようにしています<br />行末の <span class="decorationC" style="color:blue;">m?</span> は動作モードを指しています　<span class="decorationC" style="color:red;">m1</span> が冷房　<span class="decorationC" style="color:red;">m2</span> が暖房　<span class="decorationC" style="color:red;">m3</span> が除湿です　<br />http.GET(); した際のバッファサイズが不明だったんで…できるだけ切り詰めて必要最小限の内容にしました　バッファに余裕があればもっと見やすい内容にするのもアリかもしれませんね<br /><br />　　：<br /><br />そして実際に赤外線で信号を送信する部分です<br /><span class="decorationC" style="color:green;">airCon-&gt;send(irSender, POWER_ON, MODE_COOL, FAN_1, 28, VDIR_DOWN, HDIR_AUTO); // 冷房</span><br /><br />各パラメータの意味は以下のようになっています<br />// airCon-&gt;send( irSender, POWER_**, MODE_**, FAN1, 温度設定, VDIR_** , HDIR_** ); // 設定項目 ※温度設定は「整数値」で<br />// &nbsp;Arduino/libraries/HeatpumpIR/HeatpumpIR.h<br />//<br />// ・POWER (電源)<br />//&nbsp; &nbsp; POWER_ON (on)<br />//&nbsp; &nbsp; POWER_OFF (off)<br />// ・MODE (モード)<br />//&nbsp; &nbsp; MODE_AUTO (自動)<br />//&nbsp; &nbsp; MODE_COOL (冷房)<br />//&nbsp; &nbsp; MODE_HEAT (暖房)<br />//&nbsp; &nbsp; MODE_DRY (除湿)<br />//&nbsp; &nbsp; MODE_ON (不明)<br />//&nbsp; &nbsp; MODE_OFF (不明)<br />// ・FAN (風量)<br />//&nbsp; &nbsp; FAN_AUTO<br />//&nbsp; &nbsp; FAN_1 （弱）<br />//&nbsp; &nbsp; FAN_2<br />//&nbsp; &nbsp; FAN_3<br />//&nbsp; &nbsp; FAN_4<br />//&nbsp; &nbsp; FAN_5 （強）<br />// ・VDIR (風向高さ)<br />//&nbsp; &nbsp; VDIR_AUTO<br />//&nbsp; &nbsp; VDIR_UP<br />//&nbsp; &nbsp; VDIR_MUP<br />//&nbsp; &nbsp; VDIR_MIDDLE<br />//&nbsp; &nbsp; VDIR_MDOWN<br />//&nbsp; &nbsp; VDIR_DOWN<br />// ・HDIR (風向左右)<br />//&nbsp; &nbsp; HDIR_AUTO<br />//&nbsp; &nbsp; HDIR_LEFT<br />//&nbsp; &nbsp; HDIR_MLEFT<br />//&nbsp; &nbsp; HDIR_MIDDLE<br />//&nbsp; &nbsp; HDIR_MRIGHT<br />//&nbsp; &nbsp; HDIR_RIGHT<br /><br />エアコンの設定温度は整数値で指定する必要があるようです　最近は 0.5℃ 間隔で設定できるエアコンが増えてる感じですが…そこまで細かい制御には対応できないっぽいです　また今回のプログラムでは設定温度を即値の決め打ちしています　使い勝手を高めるのであればこの辺も外部から変更できるようにすべきですね<br /><br />だいたいこんな感じですかね　これを <span class="decorationC" style="color:green;">delay(30000);</span> して約 30 秒間隔のループで回しています　なにかの都合…例えば <span class="decorationC" style="color:green;">http.GET();</span> した際にサーバの返答が遅れたりするとループ間隔が長くなり指定された時間を通り越してしまうかも？って思ってこのくらいの間隔にしました　まぁこの辺は各環境によりけりで程よい設定にしてもらえればなぁって思います<br /><br />　　：<br /><br />さて…お次は UI っていうか Web サーバ側の云々ですかね　用意するのは 4 つのファイル(<span class="decorationC" style="color:green;">index.html</span>, <span class="decorationC" style="color:green;">index.css</span>, <span class="decorationC" style="color:green;">index.cgi</span>, <span class="decorationC" style="color:green;">read.cgi</span>)とスクリプトが生成する 1 つのファイル(<span class="decorationC" style="color:green;">data.txt</span>)です<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#60;!DOCTYPE html&#62;<br />&#60;html lang=&quot;ja&quot;&#62;<br />&#60;head&#62;<br />&nbsp; &nbsp;&#60;meta charset=&quot;UTF-8&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- ビューポートの設定 --&#62;<br />&nbsp; &nbsp;&#60;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&#62;<br />&nbsp; &nbsp;&#60;!-- スタイルシートの読み込み --&#62;<br />&nbsp; &nbsp;&#60;link href=&quot;./index.css&quot; rel=&quot;stylesheet&quot;&#62;<br />&nbsp; &nbsp;&#60;title&#62;M5 Atom Lite タイマー予約&#60;/title&#62;<br />&#60;/head&#62;<br />&#60;body&#62;<br /><br />&#60;center&#62;&#60;div class=&quot;red&quot;&#62;&#60;/div&#62;&#60;/center&#62;<br />&#60;center&#62;&#60;form action=&quot;./index.cgi&quot; method=&quot;get&quot;&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label for=&quot;name&quot;&#62;&#60;a href=&quot;./index.cgi&quot;&#62;M5 Atom Lite タイマー予約&#60;/a&#62;&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;st&quot; type=&quot;checkbox&quot; name=&quot;st&quot; value=&quot;1&quot;&#62;「入り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;st_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;st_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62; 分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;label&#62;&#60;input class=&quot;ed&quot; type=&quot;checkbox&quot; name=&quot;ed&quot; value=&quot;1&quot;&#62;「切り」を使う&#60;/label&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_hour&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;01&quot;&#62;01&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;02&quot;&#62;02&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;03&quot;&#62;03&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;04&quot;&#62;04&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;05&quot;&#62;05&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;06&quot;&#62;06&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;07&quot;&#62;07&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;08&quot;&#62;08&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;09&quot;&#62;09&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;11&quot;&#62;11&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;12&quot;&#62;12&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;13&quot;&#62;13&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;14&quot;&#62;14&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;15&quot;&#62;15&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;16&quot;&#62;16&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;17&quot;&#62;17&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;18&quot;&#62;18&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;19&quot;&#62;19&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;21&quot;&#62;21&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;22&quot;&#62;22&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_hour&quot; value=&quot;23&quot;&#62;23&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;時<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;select name=&quot;ed_min&quot;&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;00&quot;&#62;00&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;10&quot;&#62;10&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;20&quot;&#62;20&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;30&quot;&#62;30&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;40&quot;&#62;40&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&#60;option class=&quot;ed_min&quot; value=&quot;50&quot;&#62;50&#60;/option&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;/select&#62;分<br />&nbsp; &nbsp;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;double&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp; &#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;1&quot;&#62;冷房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;2&quot;&#62;暖房<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;md&quot; type=&quot;radio&quot; name=&quot;md&quot; value=&quot;3&quot;&#62;除湿<br />&nbsp; &nbsp;&#60;/div&#62;<br /><br />&nbsp; &nbsp;&#60;div&#62;&#60;hr class=&quot;hrline&quot; width=80% noshade&#62;&#60;/div&#62;<br />&nbsp; &nbsp;&#60;div&#62;<br />&nbsp; &nbsp;&nbsp; &nbsp;&#60;input class=&quot;submit&quot; type=&quot;submit&quot; value=&quot;予約&quot;&#62;<br />&nbsp; &nbsp;&#60;/div&#62;<br />&#60;/form&#62;&#60;/center&#62;<br /><br />&#60;/body&#62;<br />&#60;/html&#62;<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.html</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />index.html ってファイル名なんで…デフォルトで表示されるファイルっぽいですが実際にはそのような用途には使っていません　デザインしやすいようにファイルを分割してあるだけで実際に表示は index.cgi が行います<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />/* ボディ */<br />body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;margin: 0 ;<br />&nbsp; &nbsp;padding: 0 ;<br />&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;line-height: 3 ;<br />}<br /><br />input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;font-size: 30px ;<br />}<br /><br />.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;border-color: black;<br />}<br /><br />.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />}<br /><br />.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;color: &#35;ff0000;<br />}<br /><br />/* スマホだけに適用するCSS */<br />@media screen and ( max-width:479px ) {<br />&nbsp; &nbsp;body {&nbsp; &nbsp;/* 一般的な表示部 */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 20px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;input {&nbsp; &nbsp;/* チェックボックス */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;25px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;select {&nbsp; &nbsp;/* プルダウンメニュー */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 25px ;<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.hrline {&nbsp; &nbsp;/* 罫線(？) */<br />&nbsp; &nbsp;&nbsp; &nbsp;border: none;<br />&nbsp; &nbsp;&nbsp; &nbsp;background-color: &#35;fff;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-width: 1px 0 0 0;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-top: double;<br />&nbsp; &nbsp;&nbsp; &nbsp;border-color: black;<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;.submit {&nbsp; &nbsp;/* 送信ボタン */<br />&nbsp; &nbsp;&nbsp; &nbsp;width:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;100px;<br />&nbsp; &nbsp;&nbsp; &nbsp;height:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;40px;<br />&nbsp; &nbsp;&nbsp; &nbsp;-moz-transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;-webkit-transform:&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;&nbsp; &nbsp;transform:&nbsp; &nbsp;&nbsp; &nbsp;scale(1.4);<br />&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;.red {&nbsp; &nbsp;/* 設定変更した */<br />&nbsp; &nbsp;&nbsp; &nbsp;font-size: 40px ;<br />&nbsp; &nbsp;&nbsp; &nbsp;color: &#35;ff0000;<br />&nbsp; &nbsp;}<br />}<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.css</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />でっか文字な表示にしたくて見様見真似で用意しました　見様見真似の即興ってことで CSS について何一つ理解していません汗　おかしな所しかないと思うけど…まぁその辺は生温かい目で見守って頂けると幸いに思います（瀧汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />&#35;!/usr/bin/perl<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;&#35; ATOM Lite が読みにくるファイル<br />$htmlfile = &quot;./index.html&quot;;&nbsp; &nbsp;&#35; ベースとなる HTML ファイル<br /><br />if ($ENV{&apos;REQUEST_METHOD&apos;} eq &apos;POST&apos;) {&nbsp; &nbsp;&#35; POST メソッドで送られてきた場合<br />&nbsp; &nbsp;read(STDIN, $query, $ENV{&apos;CONTENT_LENGTH&apos;});<br />} else {&nbsp; &nbsp;&#35; GET メソッドで送られてきた場合<br />&nbsp; &nbsp;$query = $ENV{&apos;QUERY_STRING&apos;};<br />}<br /><br />&#35;&#35;&#35;&#35; ATOM Lite が読みにくるデータファイルを作成する &#35;&#35;&#35;&#35;<br />open (DATA, $datafile);<br />$data = &#60;DATA&#62;;&nbsp; &nbsp;&#35; 既存のデータファイルを読み内容を取り出しておく<br />if ($data =~ /s(\d),(\d\d):(\d\d) e(\d),(\d\d):(\d\d) m(\d)/) {<br />&nbsp; &nbsp;$in{&apos;st&apos;} = $1;<br />&nbsp; &nbsp;$in{&apos;st_hour&apos;} = $2;<br />&nbsp; &nbsp;$in{&apos;st_min&apos;} = $3;<br />&nbsp; &nbsp;$in{&apos;ed&apos;} = $4;<br />&nbsp; &nbsp;$in{&apos;ed_hour&apos;} = $5;<br />&nbsp; &nbsp;$in{&apos;ed_min&apos;} = $6;<br />&nbsp; &nbsp;$in{&apos;md&apos;} = $7;<br />}<br />close (DATA);<br /><br />if ($query) {&nbsp; &nbsp;&#35; データを受信していた場合の処理<br />&nbsp; &nbsp;open (DATA, &quot;&#62;&quot;, $datafile);&nbsp; &nbsp;<br />&nbsp; &nbsp;foreach $data (split(/&/, $query)) {&nbsp; &nbsp;&#35; 「&」で分割して全て処理する<br />&nbsp; &nbsp;&nbsp; &nbsp;($key, $value) = split(/=/, $data);&nbsp; &nbsp;&#35; 「name=value」のそれぞれに分割して連想配列を作っていく<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\+/ /g;&nbsp; &nbsp;&#35; 以下ざっくりとした URL デコードする<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/%(&#91;a-fA-F0-9&#93;&#91;a-fA-F0-9&#93;)/pack(&apos;C&apos;, hex($1))/eg;<br />&nbsp; &nbsp;&nbsp; &nbsp;$value =~ s/\t//g;<br />&nbsp; &nbsp;&nbsp; &nbsp;$in{&quot;$key&quot;} = $value;&nbsp; &nbsp;&#35; value = $in{&quot;$name&quot;} の連想配列が出来上がる<br />&nbsp; &nbsp;}<br />&nbsp; &nbsp;&#35; 送られてきた内容を適用してデータファイルを更新<br />&nbsp; &nbsp;if (!($query =~ /st=/)) { $in{&apos;st&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if (!($query =~ /ed=/)) { $in{&apos;ed&apos;} = &apos;0&apos;; }&nbsp; &nbsp;&#35; チェックボックスの挙動がアレなんで個別対応（汗<br />&nbsp; &nbsp;if ($in{&apos;st&apos;}) { print DATA &quot;s1,&quot;; } else { print DATA &quot;s0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;st_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;st_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;}) { print DATA &quot;e1,&quot;; } else { print DATA &quot;e0,&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { printf DATA &quot;%02d:&quot;, $in{&apos;ed_hour&apos;}; } else { print DATA &quot;00:&quot;; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { printf DATA &quot;%02d &quot;, $in{&apos;ed_min&apos;}; } else { print DATA &quot;00 &quot;; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;} eq &quot;1&quot;) { print DATA &quot;m1\n&quot;; } elsif ($in{&apos;md&apos;} eq &quot;2&quot;) { print DATA &quot;m2\n&quot;; } else { print DATA &quot;m3\n&quot;; }<br />&nbsp; &nbsp;close (DATA);<br />}<br /><br />open (IN, $htmlfile);&nbsp; &nbsp;&#35; 以下ベースとなる HTML ファイルを読み込み設定時間などを反映させる<br /><br />print &quot;Content-type: text/html; charset=UTF-8\n\n&quot;;<br />@lines = &#60;IN&#62;;<br />foreach (@lines) {<br />&nbsp; &nbsp;if ($query) { s/(&#60;div class=&quot;red&quot;&#62;)(&#60;\/div&#62;)/$1設定しました$2/; }<br /><br />&nbsp; &nbsp;if ($in{&apos;st&apos;} eq &quot;1&quot;) { s/(class=&quot;st&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;st_hour&apos;}) { s/(class=&quot;st_hour&quot; value=&quot;)($in{&apos;st_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;st_min&apos;}) { s/(class=&quot;st_min&quot; value=&quot;)($in{&apos;st_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed&apos;} eq &quot;1&quot;) { s/(class=&quot;ed&quot;)/$1 checked/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_hour&apos;}) { s/(class=&quot;ed_hour&quot; value=&quot;)($in{&apos;ed_hour&apos;}&quot;)/$1$2 selected/; }<br />&nbsp; &nbsp;if ($in{&apos;ed_min&apos;}) { s/(class=&quot;ed_min&quot; value=&quot;)($in{&apos;ed_min&apos;}&quot;)/$1$2 selected/; }<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if ($in{&apos;md&apos;}) { s/(name=&quot;md&quot; value=&quot;)($in{&apos;md&apos;}&quot;)/$1$2 checked=&quot;checked&quot;/; }<br /><br />&nbsp; &nbsp;print $_;<br />}<br />close (IN);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">index.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />実際に表示を受け持つ index.cgi です　表示を受け持ちつつ…フォームで入力された値を解釈して data.txt を生成します　そしてそのフォームで入力された値 index.html の内容を書き換えて表示するようになっています　こうしておけば以前の設定内容を次回の設定に引き継げるようになるので便利かなーって思いまして<br />そんな訳なんで .htaccess で Web サーバの設定変更が可能な場合は <span class="decorationC" style="color:red;">DirectoryIndex index.cgi</span> としてデフォルトで読み出されるファイルに設定しておくといいでしょう<br /><br />あとこの index.cgi は GET メソッドでデータを受けれられるので…極端な話パラメータ付きの URL を直打ちすることでも設定が可能です　例えば <span class="decorationC" style="color:blue;">08 時 20 分</span> に <span class="decorationC" style="color:blue;">冷房</span> で作動させ <span class="decorationC" style="color:blue;">19 時 30 分</span> に電源を切る場合だと<br /><span class="decorationC" style="color:green;">http://user:pass@hoge.orz/remocon/index.cgi?st=1&st_hour=08&st_min=20&ed=1&ed_hour=19&ed_min=30&md=1</span><br />こんな感じの URL になります　それ即ち wget や curl などのコマンドでアクセスすることが可能となり…さらに cron などを使えば毎日の動作や毎週の動作といった感じで自動化することも可能になります　いや実際に試してはないですけどたぶん大丈夫だと思います汗<br /><br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> Start of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />#!/usr/bin/perl<br /><br />print &quot;Content-type: text/plain; charset=UTF-8\n\n&quot;;<br /><br /># 現在日時の表示<br />@wdays = ( &quot;Sun&quot;, &quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thu&quot;, &quot;Fri&quot;, &quot;Sat&quot;);<br />($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time());<br />printf &quot;%04d/%02d/%02d %02d:%02d:%02d(%s)\t&quot;, $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $wdays&#91;$wday&#93;;<br /><br />$datafile = &quot;./data.txt&quot;;&nbsp; &nbsp;# ブラウザで設定した内容のファイル<br />open (DATA, $datafile);<br />print &#60;DATA&#62;;&nbsp; &nbsp;# ファイルの 1 行目を読み取り表示する<br />close (DATA);<br /><span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span> End of <span class="decorationC" style="color:red;">read.cgi</span> <span class="decorationM" style="background-color:blue;"><span class="decorationC" style="color:white;">-----</span></span><br />(M5) ATOM Lite がアクセスしてくるファイル(CGI)です　現在日時を整形して表示して…あとは index.cgi が生成した data.txt の内容をくっつけて送信してくれます<br /><br />　　：<br /><br />ごちゃごちゃ長くなったんで以下にまとめときます　「名前を付けてリンク先を保存」とかすれば手間がなくていいと思いますたぶん<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/remocon.ino" rel="noopener noreferrer" target="_blank">remcon.ino</a>&nbsp; &nbsp;(M5) ATOM Lite 用 Arduino Sketch ファイル <br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.html" rel="noopener noreferrer" target="_blank">index.html</a>&nbsp; &nbsp;表示のベースとなる HTML ファイル<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.css" rel="noopener noreferrer" target="_blank">index.css</a>&nbsp; &nbsp;でっか文字にするためのアレ<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/index.cgi" rel="noopener noreferrer" target="_blank">index.cgi</a>&nbsp; &nbsp;ページ表示しつつデータファイルを作成する<br /><a class="url labeledlink" href="https://room.dengeki.jp/remocon/read.cgi" rel="noopener noreferrer" target="_blank">read.cgi</a>&nbsp; &nbsp;(M5) ATOM Lite が読みに来る先のやつ<br />data.txt &nbsp;index.cgi が作成するデータファイル<br /><br /><img class="embeddedimage nolisted" width="4032" height="2268" src="https://room.dengeki.ne.jp/images/20230717165352-admin.jpg" alt="20230717165352-admin.jpg"><br />そして後はいい感じに設置して完了ですかね　(M5) ATOM Lite の赤外線はかなり飛距離が短いんで…エアコンにへばりつけるような設置になっちゃうのかな<br /><br />あーあと余談っていうか注意事項ですが (M5) ATOM Lite が読みに来る read.cgi は数十秒に 1 回のペースで 24 時間 365 日延々とアクセスがあります　そのままの Web サーバだと…そのアクセス毎にログファイルが蓄積されることになります　もし可能なら Web サーバの設定を変更して…このアクセスに対してのみログの書き込みを抑制するなどしたほうがいいと思います　ざっくり <a class="url labeledlink" href="https://www.google.com/search?q=SetEnvIf+nolog" rel="noopener noreferrer" target="_blank">SetEnvIf nolog</a> &nbsp;なんて感じのキーワードでぐぐれば必要な情報に辿り着けるとイイナ！<br /><br />　　：<br /><br />そんな感じで最後までご覧いただきありがとございました汗　ざっくりテスト用に作ったのをイジくりまわした代物なのでいろいろおかしな部分はありますが…手っ取り早く動作を体感してみたい！って時には役立つかもです　それにしても 1,000円 ちょっとで買える (M5) ATOM Lite はホントすごいですよね　きちんと筐体に収められていつつ… Wi-fi で接続を確立して HTTP でデータを取ってくることができる　赤外線 LED でリモコンのような動作もさせられる　欲を云えば RTC(時計) が欲しかったかなって感じではあるけど…それもどっかのサーバに接続して時刻を取得すればそれほど問題にはならないんでまぁいいかな♪　なんかそんなかんじで <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%4d%35%53%74%69%63%6b%43" class="taglink" title="M5StickC">#M5StickC</a> -- Posted by 猫山ぽるか 〔19935文字〕 No.37 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=37</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=37</guid>
	<category>info</category>
	<pubDate>Mon, 17 Jul 2023 08:43:28 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ M5StickC Plus の開発環境を構築する ]]></title>
	<description><![CDATA[ M5StickC Plus の開発環境を構築する<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.ne.jp/images/20220326153456-admin.jpg" alt="20220326153456-admin.jpg"><br />　<br /><a class="url labeledlink" href="https://elchika.com/" rel="noopener noreferrer" target="_blank">elchika公式</a> <a class="url labeledlink" href="https://twitter.com/elchika_info" rel="noopener noreferrer" target="_blank">@elchika_info</a> さんがリツイートキャンペーンを行っていたのですが…<br /><a class="url labeledlink" href="https://twitter.com/elchika_info/status/1494506958799486977" rel="noopener noreferrer" target="_blank">Tweet</a><br />それに応募したら大当選しちゃいました！！<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507198-admin.jpg" alt="202203261507198-admin.jpg"><br />そんな訳で <a class="url labeledlink" href="https://docs.m5stack.com/en/core/m5stickc_plus" rel="noopener noreferrer" target="_blank">M5StickC Plus</a> を頂きました！　本当にありがとございます！！(&gt;_&lt;)ｗ<br />こないだから Arduino Pro Micro をぼちぼちとイジり始めてマイコンへの興味が盛り上がってきた所なんで…さらに見識を深めることができそうで嬉しいです！(&gt;_&lt;)ｗ<br /><br />　　：<br /><br />そんな M5StickC Plus の外観をざっくり見てみましょう<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507197-admin.jpg" alt="202203261507197-admin.jpg"> <img class="embeddedimage " width="800" height="800" src="https://room.dengeki.ne.jp/images/202203261507191-admin.jpg" alt="202203261507191-admin.jpg"><br />裏面には I/O の説明が所狭しと書かれています　何かとよく使う(と思われる)ボタンや LED のピン番号なんかも書かれているんで…ド忘れした時とかでも困らないと思います<br /><br /><img class="embeddedimage " width="800" height="800" src="https://room.dengeki.ne.jp/images/20220326150719-admin.jpg" alt="20220326150719-admin.jpg"><br />USB は Type-C のようです<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507195-admin.jpg" alt="202203261507195-admin.jpg"> <img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507194-admin.jpg" alt="202203261507194-admin.jpg"><br />USB を挿して電源が供給されると起動するようです　何やらセンサーの状況が見れるようなものとかマイクのテストや赤外線の送信(？)のようなものを「M5」ボタンで切り替えながら楽しめるようです<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507193-admin.jpg" alt="202203261507193-admin.jpg"><br />ちなみに電源の ON/OFF は側面のボタンを長押しすることにより操作できるようです　電源を ON する場合には 2 秒位の長押しで電源を OFF にする場合は 6 秒くらい長押しするといいようです<br /><br />　　：<br /><br />そんな訳なんで動作チェックがてら開発環境を整えていきましょう　M5StickC Plus (M5Stackシリーズ) の開発環境は Arduino IDE を使ってどうにかできるようなんで手軽っちゃぁ手軽ですよね<br />その辺の詳細な手順については <a class="url labeledlink" href="https://docs.m5stack.com/en/arduino/arduino_development" rel="noopener noreferrer" target="_blank">公式</a> に詳しく書かれていたんで…それを実際に試していきたいと思います<br /><br /><img class="embeddedimage " width="732" height="548" src="https://room.dengeki.ne.jp/images/2022032615071914-admin.png" alt="2022032615071914-admin.png"><br />まずは Arduino IDE の「ファイル」→「環境設定」を開きます<br /><br /><img class="embeddedimage " width="925" height="552" src="https://room.dengeki.ne.jp/images/2022032615071913-admin.png" alt="2022032615071913-admin.png"><br />その中の「追加ボードマネージャのURL」に <a class="url" href="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json" rel="noopener noreferrer" target="_blank" title="https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json">https://m5stack.oss-cn-shenzhen.aliyuncs...</a> を追加して「ok」します<br /><br /><img class="embeddedimage " width="797" height="555" src="https://room.dengeki.ne.jp/images/2022032615071912-admin.png" alt="2022032615071912-admin.png"><br />お次に「ツール」→「ボード」→「ボードマネージャ」を開きます<br /><br /><img class="embeddedimage " width="998" height="533" src="https://room.dengeki.ne.jp/images/2022032615071911-admin.png" alt="2022032615071911-admin.png"><br />検索欄に「m5stack」と入れて出てきた「M5Stack」をインストールする<br /><br /><img class="embeddedimage " width="894" height="671" src="https://room.dengeki.ne.jp/images/2022032615071910-admin.png" alt="2022032615071910-admin.png"><br />これで「ツール」→「ボード」とした際に「M5Stick-C Plus」を選べるようになります<br /><br />　　：<br /><br />使用ボードの設定が済んだらライブラリをインストールします<br /><br /><img class="embeddedimage " width="746" height="559" src="https://room.dengeki.ne.jp/images/202203261507199-admin.png" alt="202203261507199-admin.png"><br />「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を開きます<br /><br /><img class="embeddedimage " width="998" height="533" src="https://room.dengeki.ne.jp/images/202203261507198-admin.png" alt="202203261507198-admin.png"><br />検索欄に「m5stickcplus」と入れて出てきた「M5StickCPlus」をインストールします<br /><br /><img class="embeddedimage " width="561" height="965" src="https://room.dengeki.ne.jp/images/202203261507197-admin.png" alt="202203261507197-admin.png"><br />なんか関連したライブラリ(？)も一緒にインストールするか聞かれるんだけど…よく判んなかったんで全部入れちゃいました（汗<br /><br /><img class="embeddedimage " width="925" height="552" src="https://room.dengeki.ne.jp/images/202203261507196-admin.png" alt="202203261507196-admin.png"><br />ちなみに…もし間違ったライブラリを入れちゃった時にそれを消したい場合は「ファイル」→「環境設定」で確認できる「スケッチブックの保存場所」で確認できるフォルダを開いて libraries フォルダを開いて<br /><br /><img class="embeddedimage " width="886" height="791" src="https://room.dengeki.ne.jp/images/202203261507195-admin.png" alt="202203261507195-admin.png"><br />該当するライブラリが入っているフォルダを削除して Arduino IDE を再起動すると消すことができるようです<br /><br /><img class="embeddedimage " width="566" height="425" src="https://room.dengeki.ne.jp/images/202203261507194-admin.png" alt="202203261507194-admin.png"> <img class="embeddedimage " width="500" height="374" src="https://room.dengeki.ne.jp/images/202203261507193-admin.png" alt="202203261507193-admin.png"><br />まぁとにかくコレで M5StickC Plus のライブラリをインクルードできるようになりました<br /><br />　　：<br /><br />それじゃ実際にコードを書いてコンパイルして M5StickC Plus に書き込んでみましょう　まぁ本来なら LED を点滅させる…いわゆる「Ｌチカ」を試すべきトコロなんですが液晶ディスプレイが搭載されているって事なんでそれに文字を出力させてみましょう<br /><br />----------<br /><br />&#35; include &lt;M5StickCPlus.h&gt;<br /><br />void setup(){<br />&nbsp; M5.begin(); // M5StickC Plus の初期化？<br />}<br /><br />void loop() {<br />&nbsp; M5.Lcd.setTextSize(3); &nbsp;// フォントサイズ<br />&nbsp; M5.Lcd.setRotation(3); &nbsp;// 画面表示の向き<br />&nbsp; M5.Lcd.print(&quot;Hello World&quot;); &nbsp;// お決まりのやつ<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="500" height="375" src="https://room.dengeki.ne.jp/images/202203261507191-admin.png" alt="202203261507191-admin.png"><br />ざっくりこんな感じですかね　これをマイコンボードに書き込んでみましょう<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202203261507192-admin.jpg" alt="202203261507192-admin.jpg"><br />無事に「Hello World」と表示されて大成功です！<br /><br />　　：<br /><br />ちなみにコンパイル時に…我が家の環境では以下のようなエラーが発生しました<br /><br /><span class="decorationC" style="color:red;">Traceback (most recent call last):<br />&nbsp; File &quot;/home/nekoyama/.arduino15/packages/m5stack/tools/esptool_py/3.1.0/esptool.py&quot;, line 38, in &lt;module&gt;<br />&nbsp;&nbsp; &nbsp;import serial<br />ModuleNotFoundError: No module named &apos;serial&apos;<br />exit status 1<br />ボードM5Stick-C-Plusに対するコンパイル時にエラーが発生しました。</span><br /><br />これは Python にシリアル通信するための pyserial モジュールが入ってない時に発生するらしいので…<br /><br /><img class="embeddedimage " width="736" height="479" src="https://room.dengeki.ne.jp/images/202203261507192-admin.png" alt="202203261507192-admin.png"><br /><span class="decorationC" style="color:green;">pip install pyserial</span> としてインストールしておけばいいようですメモ<br /><br />　　：<br /><br /><img class="embeddedimage " width="617" height="600" src="https://room.dengeki.ne.jp/images/20220326150719-admin.png" alt="20220326150719-admin.png"><br />さらにちなみに初回起動時に動いていたセンサーの状況が見れるようなものとかマイクのテストや赤外線の送信(？)のようなものは「ファイル」→「スケッチ例」→「M5StickCPlus」→「FactoryTest」で再び入れ直せるようです　他にも参考になりそうなものが用意されているんで…ざっと目を通しておくといいかもです<br /><br />　　：<br /><br />Arduino Pro Micro と M5StickC Plus を比べると…すぐに使える I/O が豊富でいろいろ興味を駆り立てられてしまいますね！　特に ESP32 ってやつですかね　Wi-Fi でコネクションを確立したりその後に HTTP としてサーバからドキュメンをを取ってこれたりもできるようなんで Web サーバと連携させて M5StickC Plus をリモートで操作するようなものとか作れるかもしれんですね！<br />そんな感じで引き続きぼちぼちイジっていきたいと思います <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%4d%35%53%74%69%63%6b%43" class="taglink" title="M5StickC">#M5StickC</a> -- Posted by 猫山ぽるか 〔2732文字〕 No.24 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=24</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=24</guid>
	<category>info</category>
	<pubDate>Sat, 26 Mar 2022 15:07:18 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino とマトリクスキーボード ]]></title>
	<description><![CDATA[ Arduino とマトリクスキーボード<br /><img class="embeddedimage " width="220" height="220" src="https://room.dengeki.ne.jp/images/202202201020325-admin.jpg" alt="202202201020325-admin.jpg"><br />　<br />以前にどうにかしてたっていうか「<a href="https://room.dengeki.ne.jp/tegalog.cgi?postid=8" class="postidlink">Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう！</a>」の後ぐらいにいろいろ調べてたら…なんかマトリクス・キーボードっていうの？　少ないピン数で多くのスイッチを読み取れる方法があるらしい？？ってのを見つけて気になってたんで勉強がてらその辺を試してみることにしました<br /><br />そんなマトリクスってのを日本語的に云うと…碁盤の目みたいなものって感じになるっぽい？　それをキーボード的に実装すると…例えば横方向にマイコンから何本かの出力線を這わせておいてそれと何本かの入力線をスイッチを介してあたかも碁盤の目のように配置したもの？ってなるらしい？？<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/202202201020324-admin.jpg" alt="202202201020324-admin.jpg"> <img class="embeddedimage " width="1000" height="957" src="https://room.dengeki.ne.jp/images/20211113072346-admin.jpg" alt="20211113072346-admin.jpg"><br />そんな感じで <a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B086GPX434" rel="noopener noreferrer" target="_blank">Arduino VKLSVAN Pro Micro USB ATmega32U4</a> (※以下 Arduino と略す)を使って実際に作ってみました　ちなみに Pro Micro のピン配列図はこんな感じです　つーかブレッドボード(？)が狭くて碁盤の目になってなくてアレですよね（汗<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.ne.jp/images/202202201020325-admin.png" alt="202202201020325-admin.png"><br />回路図的なものにするとこんな感じです　つーか回路図なんて描いたことないんで正しくない図かもしれませんが…まぁ概念的な絵だと思って見てください（滝汗<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.ne.jp/images/202202201020324-admin.png" alt="202202201020324-admin.png"><br />ここでは Arduino の <span class="decorationC" style="color:blue;">6</span> 番ピンと <span class="decorationC" style="color:blue;">7</span> 番ピンを出力として使い <span class="decorationC" style="color:darkgreen;">14</span> 番ピンと <span class="decorationC" style="color:darkgreen;">15</span> 番ピンを入力として使います<br />そして <span class="decorationC" style="color:blue;">6</span> 番ピンのみに信号を出力します　その状態で <span class="decorationC" style="color:red;">A</span> もしくは <span class="decorationC" style="color:red;">B</span> のスイッチが押されればそれぞれ対応した <span class="decorationC" style="color:darkgreen;">14</span> 番ピンか <span class="decorationC" style="color:darkgreen;">15</span> 番ピンで信号を読み取ることができます　それにより <span class="decorationC" style="color:red;">A</span> もしくは <span class="decorationC" style="color:red;">B</span> のスイッチが押されたかどうかを特定できます<br />※なんか PULLUP 回路の都合上っていうの？<br />※普段は HIGH にしてあって…「出力する」としたものを LOW にすることで動作する仕組みです　ちょっとややこしいですね(-_-；)<br /><br /><img class="embeddedimage " width="850" height="850" src="https://room.dengeki.ne.jp/images/202202201020323-admin.png" alt="202202201020323-admin.png"><br />引き続き今度は <span class="decorationC" style="color:blue;">7</span> 番ピンにのみ信号を出力します　その状態で <span class="decorationC" style="color:red;">C</span> もしくは <span class="decorationC" style="color:red;">D</span> のスイッチが押されればそれぞれ対応した <span class="decorationC" style="color:darkgreen;">14</span> 番ピンか <span class="decorationC" style="color:darkgreen;">15</span> 番ピンで信号を読み取ることができます　それにより <span class="decorationC" style="color:red;">C</span> もしくは <span class="decorationC" style="color:red;">D</span> のスイッチが押されたかどうかを特定できます<br />この一連の動作を繰り返すことにより碁盤の目のように配置されたスイッチを特定していく…そんな構造のキーボードをマトリクスキーボードと呼ぶらしいです<br /><br />それでは実際にスケッチを書いて動作を確認してみましょう<br /><br />----------<br /><br />&#35;include &quot;Keyboard.h&quot;<br /><br />void setup() {<br />&nbsp; pinMode(6, OUTPUT);<br />&nbsp; pinMode(7, OUTPUT);<br />&nbsp; pinMode(14, INPUT_PULLUP);<br />&nbsp; pinMode(15, INPUT_PULLUP);<br /><br />&nbsp; digitalWrite(6, HIGH); &nbsp;// 6 番ピンを HIGH にしておく<br />&nbsp; digitalWrite(7, HIGH); &nbsp;// 7 番ピンを HIGH にしておく<br /><br />&nbsp; Serial.begin(9600);<br />&nbsp; Keyboard.begin();<br />}<br /><br />void loop() {<br />// -------------------------------- //<br />&nbsp; digitalWrite(6, LOW); // 6 番ピンを LOW にしてスキャン開始<br />&nbsp; if (digitalRead(14) == LOW) { // 14 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;A\n&quot;); &nbsp;// LOW なら A のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;A\n&quot;);<br />&nbsp; }<br />&nbsp; if (digitalRead(15) == LOW) { // 15 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;B\n&quot;); &nbsp;// LOW なら B のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;B\n&quot;);<br />&nbsp; }<br />&nbsp; digitalWrite(6, HIGH); &nbsp;// 6 番ピンを HIGH にしてスキャン終了<br />// -------------------------------- //<br />&nbsp; digitalWrite(7, LOW); // 7 番ピンを LOW にしてスキャン開始<br />&nbsp; if (digitalRead(14) == LOW) { // 14 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;C\n&quot;); &nbsp;// LOW なら C のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;C\n&quot;);<br />&nbsp; }<br />&nbsp; if (digitalRead(15) == LOW) { // 15 番ピンは LOW になっている？<br />&nbsp;&nbsp; &nbsp;Serial.print(&quot;D\n&quot;); &nbsp;// LOW なら D のスイッチが押されている<br />&nbsp;&nbsp; &nbsp;Keyboard.print(&quot;D\n&quot;);<br />&nbsp; }<br />&nbsp; digitalWrite(7, HIGH); &nbsp;// 7 番ピンを HIGH にしてスキャン終了<br />// -------------------------------- //<br />&nbsp; delay(100); // 適当に待って繰り返し<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="918" height="535" src="https://room.dengeki.ne.jp/images/202202201020322-admin.png" alt="202202201020322-admin.png"><br />シリアルモニタとテキストエディタを並べて動作テストしてみましょう　スイッチに対応した文字が表示されれば成功です　ちなみに今回はシリアルモニタとテキストエディタの両方に出力するようにしてますが…初期のテスト段階ではシリアルモニタだけを使ったほうがいいかもですね<br /><br />　　：<br /><br />さてそんな感じでマトリクス・キーボードの大まかな動作を理解できた気になったんで…ぼちぼちマルチメディアキーボード的なやつを作るか！って思いたいトコロなんだけどスイッチ類を買い揃えて配線したりとかとかしょーみ面倒くさいなぁと思ってたんですよね　そう思いつつ某Ａマゾンを眺めてたら気になるものを見つけました<br /><br /><a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B0978YTZV1" rel="noopener noreferrer" target="_blank">Ren He 5個セット 16キー 4*4 マトリックス フィルム ボタン キーボード マトリックススイッチ キーパッド メンブレン式 マトリックスキーボード Arduinoに対応</a><br /><br />かなり怪しげな感じだけど 5 個入りなのに 600 円でお釣りがきちゃうお値段に釣られてポチっちゃいました　初期不良でいくつか動かなかったとしても十分にお値打ちっポイネ！！<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/202202201020323-admin.jpg" alt="202202201020323-admin.jpg"><br />なんか適当なプチプチに包まれた荷姿で届くと思ってたのに…郵便受けをギリ通る厚みのプラケースに入れられて来ましたｗ　やるじゃんｗｗ<br /><br /><img class="embeddedimage " width="1550" height="1250" src="https://room.dengeki.ne.jp/images/202202201020321-admin.png" alt="202202201020321-admin.png"><br />ちなみにデータシートの類は入ってなかったんで自力で配線を解析する必要があったけど…まぁわりと素直な作りだったんで簡単に判明してよかったです　そして Arduino と接続したピン番号とかも<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/20220220102032-admin.jpg" alt="20220220102032-admin.jpg"> <img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/202202201020321-admin.jpg" alt="202202201020321-admin.jpg"> <img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202202201020322-admin.jpg" alt="202202201020322-admin.jpg"><br />実際に接続してみました　まぁ毎度のごとく「接続例」って感じなんで…この辺は各人のお好みでどうにかしてもらえばいいかと思います<br /><br />それでは早速スケッチを書いて動作を確認してみましょう<br /><br />----------<br /><br />const byte KEYOT&#91;&#93; = {<span class="decorationC" style="color:red;">4</span>, <span class="decorationC" style="color:red;">5</span>, <span class="decorationC" style="color:red;">6</span>, <span class="decorationC" style="color:red;">7</span>}; &nbsp;// 出力ピンの設定<br />const byte KEYIN&#91;&#93; = {<span class="decorationC" style="color:red;">14</span>, <span class="decorationC" style="color:red;">15</span>, <span class="decorationC" style="color:red;">18</span>, <span class="decorationC" style="color:red;">19</span>}; &nbsp;// 入力ピンの設定<br />const int WAIT = <span class="decorationC" style="color:red;">100</span>; // ちょっと待たせる<br /><br />// &nbsp;関数 keyscan() がキーの状態を読み取った値を入れておく配列<br />byte SW&#91;sizeof(KEYOT)&#93;&#91;sizeof(KEYIN)&#93;;<br /><br />const byte ON = LOW; &nbsp;// LOW と HIGH を…<br />const byte OF = HIGH; // ON と OF の別名で定義しておく<br /><br />void setup() {<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;pinMode(KEYOT&#91;i&#93;, OUTPUT); &nbsp;// 出力ピンのモード設定<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, HIGH); // 出力ピンを HIGH に設定<br />&nbsp; }<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYIN); i++) {<br />&nbsp;&nbsp; &nbsp;pinMode(KEYIN&#91;i&#93;, INPUT_PULLUP); &nbsp;// 入力ピンを PULLUP モードに設定<br />&nbsp; }<br />&nbsp; Serial.begin(9600); // シリアル通信を開始<br />}<br /><br />void loop() {<br />&nbsp; keyscan(); &nbsp;// キーの状態を読み取る<br />// -------------------------------- //<br />&nbsp; if (SW&#91;0&#93;&#91;0&#93; == ON) { Serial.println(&quot;1&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;1&#93; == ON) { Serial.println(&quot;2&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;2&#93; == ON) { Serial.println(&quot;3&quot;); }<br />&nbsp; if (SW&#91;0&#93;&#91;3&#93; == ON) { Serial.println(&quot;A&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;1&#93;&#91;0&#93; == ON) { Serial.println(&quot;4&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;1&#93; == ON) { Serial.println(&quot;5&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;2&#93; == ON) { Serial.println(&quot;6&quot;); }<br />&nbsp; if (SW&#91;1&#93;&#91;3&#93; == ON) { Serial.println(&quot;B&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;2&#93;&#91;0&#93; == ON) { Serial.println(&quot;7&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;1&#93; == ON) { Serial.println(&quot;8&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;2&#93; == ON) { Serial.println(&quot;9&quot;); }<br />&nbsp; if (SW&#91;2&#93;&#91;3&#93; == ON) { Serial.println(&quot;C&quot;); }<br />// -------------------------------- //<br />&nbsp; if (SW&#91;3&#93;&#91;0&#93; == ON) { Serial.println(&quot;*&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;1&#93; == ON) { Serial.println(&quot;0&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;2&#93; == ON) { Serial.println(&quot;&#35;&quot;); }<br />&nbsp; if (SW&#91;3&#93;&#91;3&#93; == ON) { Serial.println(&quot;D&quot;); }<br />// -------------------------------- //<br />&nbsp; delay(WAIT);<br />}<br /><br />void keyscan() { &nbsp;// キーの状態を読み取る関数<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, LOW); &nbsp;// 特定の出力ピンを LOW にする<br />&nbsp;&nbsp; &nbsp;for (byte j = 0; j &lt; sizeof(KEYIN); j++) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (digitalRead(KEYIN&#91;j&#93;) == ON) { &nbsp;// 入力ピンの状態を読む<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; SW&#91;i&#93;&#91;j&#93; = ON; &nbsp;// キーが押されている<br />&nbsp;&nbsp; &nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; SW&#91;i&#93;&#91;j&#93; = OF; &nbsp;// キーは離されている<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;digitalWrite(KEYOT&#91;i&#93;, HIGH); // LOW にした出力ピンを HIGH に戻す<br />&nbsp; }<br />}<br /><br />----------<br /><br />冒頭にある<br /><br />const byte KEYOT&#91;&#93; = {<span class="decorationC" style="color:red;">4</span>, <span class="decorationC" style="color:red;">5</span>, <span class="decorationC" style="color:red;">6</span>, <span class="decorationC" style="color:red;">7</span>}; &nbsp;// 出力ピンの設定<br />const byte KEYIN&#91;&#93; = {<span class="decorationC" style="color:red;">14</span>, <span class="decorationC" style="color:red;">15</span>, <span class="decorationC" style="color:red;">18</span>, <span class="decorationC" style="color:red;">19</span>}; &nbsp;// 入力ピンの設定<br />const int WAIT = <span class="decorationC" style="color:red;">100</span>; // ちょっと待たせる<br /><br />この辺と…あとは loop() 内を書き換えるだけでいいように書いてみました　<span class="decorationC" style="color:red;">使用するピン数が増減</span>しても概ね追従できると思います<br />あーあと setup() で使用したい機能を開始させるような辺りの書き換えも必要ですかね<br /><br />それと…話がややこしくなるとアレなんで今回はシリアル通信のみで動作チェックしています<br /><br />キーの状態を読み取る keyscan() 関数ってのがありますが…グローバル変数を使っているので引数も返り値もありません<br />読み取った値は SW&#91;&#93;&#91;&#93; って二次元配列にセットしています<br /><br />あと PULLUP の特性っていうか普段が HIGH となっていて…スイッチが押されると LOW になるって辺りが何となく直感的にイメージしにくいように思えたんで<br />const byte ON = LOW; &nbsp;// LOW と HIGH を…<br />const byte OF = HIGH; // ON と OF の別名で定義しておく<br />って感じでスイッチが押されてる ON ってのとスイッチが離されてる OF って感じの別名で定義してあります<br /><br />　　：<br /><br />そして loop() 内で keyscan() を呼んでキーの状態を読み取っておいて…あとは個々の SW&#91;&#93;&#91;&#93; の状態に応じてお好みの文字(列)を出力させるなり何なりをすればいいでしょう<br />将来的にっていうかもし「1」が押されてたらキーボードとして文字を出力して「&#35;」が押されてたらマウスの右クリックを…って感じで様々な処理を行えるよう少しばかり長ったらしく書いてあります<br /><br />この辺の「やること」の種類が決まりきっているのであれば<br /><br />void loop() {<br />&nbsp; keyscan();<br />// -------------------------------- //<br />&nbsp; const char* str&#91;&#93; = {<br />&nbsp;&nbsp; &nbsp;&quot;1\n&quot;, &quot;2\n&quot;, &quot;3\n&quot;, &quot;A\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;4\n&quot;, &quot;5\n&quot;, &quot;6\n&quot;, &quot;B\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;7\n&quot;, &quot;8\n&quot;, &quot;9\n&quot;, &quot;C\n&quot;,<br />&nbsp;&nbsp; &nbsp;&quot;*\n&quot;, &quot;0\n&quot;, &quot;&#35;\n&quot;, &quot;D\n&quot;,<br />&nbsp; };<br />&nbsp; for (byte i = 0; i &lt; sizeof(KEYOT); i++) {<br />&nbsp;&nbsp; &nbsp;for (byte j = 0; j &lt; sizeof(KEYIN); j++) {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (SW&#91;i&#93;&#91;j&#93; == ON) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Serial.print(str&#91;sizeof(KEYOT) * i + j&#93;);<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />// -------------------------------- //<br />&nbsp; delay(WAIT);<br />}<br /><br />こんなふうに for() で回すように書けばもうちょっとスッキリするかもしれんですね　これはまぁ「やること」の内容によっていろいろ書き方があるよねって事で参考までに<br /><br />　　：<br /><br />あーあと後半の中華クソ安 16 キーボードでの実験ではテキストエディタへの文字出力を行っていないんですが…これを実際に行うと不具合が出るものがあります<br /><br /><img class="embeddedimage " width="535" height="535" src="https://room.dengeki.ne.jp/images/20220220102032-admin.png" alt="20220220102032-admin.png"><br />キーボード上の「*」 なんですけどね　シリアルモニタではちゃんと「*」が出力されているのに…テキストエディタ上では「(」になってしまいます<br />※別のスケッチでテストした際の画像です<br /><br />これは &#35;include &quot;Keyboard.h&quot; した際のキーボードレイアウトが KeyboardLayout_en_US になってて…まぁいわゆる US キーボードってやつですかね　これが日本で一般的に使われている JIS キーボードとレイアウト(キーの配置)が違うから起こる現象のようです<br />アルファベットと数字に関しては問題ないのですが…記号はその多くが US と JIS とで配列が違うんで問題になります<br /><br /><img class="embeddedimage " width="1240" height="923" src="https://room.dengeki.ne.jp/images/202202201033061-admin.png" alt="202202201033061-admin.png"><br />先ほどの「*」を例にすると… US キーボードでは「*」が「8」のキーに割り当てられています<br /><br /><img class="embeddedimage " width="1240" height="923" src="https://room.dengeki.ne.jp/images/20220220103306-admin.png" alt="20220220103306-admin.png"><br />そのキーコードを JIS キーボードに当てはめると「8」のキーにあるのは「(」って事になるので正しく表示されないのです<br /><br />困っちゃいますよね…そこそこ数が出回ってる(と思われる) JIS キーボードなんだで Keyboard.begin(KeyboardLayout_ja_JP); くらい通るようにしといてほしいのに！って思うんだけどそうはいきません(-_-；)<br /><br />どうしたもんかなーって思いつつ調べてたら…何やら Keyboard.h を複製した後に JIS キーボード向けに書き換える手法を見つけました→ <a class="url labeledlink" href="https://mgt.blog.ss-blog.jp/2016-01-14" rel="noopener noreferrer" target="_blank">Arduino Leonardoで\記号を打つ：メガギガテラス：So-netブログ</a><br />実際に試してみたところ…これでバッチリ動作しました！　まぁあくまで自己責任で！って感じになるんだけど…自作キーボードでいろいろしたい！って場合にはとても有用な情報だと思うんで参考にしてみてください<br /><br />　　：<br /><br />キーボード自作って話になると耳にするマトリクスキーボードってやつですね　今までは何となく漠然と聞き流していたんですが…今回はその辺に踏み込んでその原理をほんのり理解できた気になれてよかったです　マイコン側のピン数を減らしつつ…より多くのキーを読み取るテクニックは今後も色々と使えそうなんで今後もより掘り下げた勉強をしていきたいなって思いました<br /><br />あと…マトリクスキーボードの構造的な問題っていうか特定条件の複数キーの同時押しをした際に正常に動きません　今回の中華クソ安 16 キーボードを使った実験を例にとると…縦軸に配されたキー(例えば「1と4」とか「AとBとC」とか)を同時押しすると「どれも押されてない」って判定されます　まぁなんか読みたいキーとは別のスイッチを介して HIGH が逆流してくる(？)ことにより誤動作するらしく…そんな逆流を防ぐためにダイオードを入れるって事らしいんですが今回は既成品でその辺をどうにもできかねる感じなんでそのままにしてあります（汗<br /><br />まぁその辺を踏まえた上で…この中華クソ安 16 キーボードでマルチメディアキーボード的なものを作るとしますかね　程々に硬い板に貼り付けて配線の取りまとめをすればいいだけって感じの見栄えよりお手軽さ！って感じのアレですが（瀧汗<br /><br />そんなこなんで今回も長々とお疲れさまでした！　安いのに遊び甲斐のある Arduino をもっと色々と使い倒していきタイネ！(&gt;_&lt;)ｗ <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔7955文字〕 No.21 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=21</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=21</guid>
	<category>info</category>
	<pubDate>Sun, 20 Feb 2022 10:20:32 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino の シリアル通信 ]]></title>
	<description><![CDATA[ Arduino の シリアル通信<br /><img class="embeddedimage " width="240" height="240" src="https://room.dengeki.ne.jp/images/20220130153543-admin.png" alt="20220130153543-admin.png"><br />　<br /><a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B086GPX434" rel="noopener noreferrer" target="_blank">Arduino VKLSVAN Pro Micro USB ATmega32U4</a> (※以下 Arduino と略す)で開発してる際のデバッグとかで「変数がどうなってるのか」を見たくなることはありませんか？　私はあります　いやむしろ見ないとやってられません！！(&gt;_&lt;)ｗって感じなんだけど Arduino にはモニタ出力がありません<br /><br /><img class="embeddedimage " width="970" height="624" src="https://room.dengeki.ne.jp/images/20220130153543-admin.jpg" alt="20220130153543-admin.jpg"><br />なんか LCD ディスプレイとやらを接続すれば文字なんかを表示させられるっぽいけど…接続とか面倒そうだし手が出ないなぁと思ってたけど何やら「シリアル通信」ってので PC と文字のやりとりができるらしいじゃん！？　まじか！！<br /><br />そんなシリアル通信は Arduino IDE から使えるようです<br /><br /><img class="embeddedimage " width="500" height="362" src="https://room.dengeki.ne.jp/images/202201301535436-admin.png" alt="202201301535436-admin.png"><br />&#91;メニュー&#93; → &#91;ツール&#93; → &#91;シリアルモニタ&#93; と操作するか…<br /><br /><img class="embeddedimage " width="500" height="362" src="https://room.dengeki.ne.jp/images/202201301535435-admin.png" alt="202201301535435-admin.png"><br />もしくはツールバーにある虫メガネみたいなアイコンを押下すると出てきます<br /><br /><img class="embeddedimage " width="850" height="505" src="https://room.dengeki.ne.jp/images/202201301535434-admin.png" alt="202201301535434-admin.png"><br />出てきた「シリアルモニタ」はこんな感じです<br />我が家の環境では「改行コード = LFのみ」で「通信速度 = 9600bps」が初期設定となっていました<br /><br />通信速度は Arduino 側で設定した速度とシリアルモニタで設定する速度は同じものにしておく必要がある…らしいんですが軽くイジってみた感じでは設定値に関係なく動作しているっぽい感じなんで気にする必要はないのかもしれません<br /><br />改行コードは Linux 系が「LF」で Mac 系(の昔のやつ？)が「CR」で… Windows 系が「CR+LF」と聞いたことがあるので機種ごとに適切なものに変更しておいたほうがいいの？<br />ざっくり使ってみた感じでは… Arduino からシリアルモニタに送られてくる場合の改行コードは設定の影響を受けないっぽいです　シリアルモニタから Arduino に送信する際に「送信ボタンを押した」もしくは「エンターキーを押した」時に改行コードをどのようにするかの設定となるようです　なおここでの解説は改行コードを「LFのみ」に設定してあるものとします<br /><br />　　：<br /><br />それでは早速と言うか Arduino からシリアルモニタに文字を送信してみましょう　シリアル通信を開始するには以下のように記述します<br />Serial.begin(speed) ってやつですね　speed は BPS で… 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 なんかがよく使われがちですがそれ以外の値も指定できるようです　ここでの解説では「9600」を使用するとします<br /><br />その後は Serial.print() や Serial.println() を使ってシリアルモニタに数値や文字列を送信できます　Serial.print() は C で云うトコロの sprintf() を意識した作りとなってるようですが…書式を全て解説するのもアレなんでその辺は手を抜いてざっくりサンプルを載せておきます<br /><br />----------<br /><br />void setup() {<br />&nbsp; Serial.begin(9600); // シリアル通信を開始する<br />}<br /><br />void loop() {<br />&nbsp; unsigned long time = millis() / 1000; // 動作時間を秒の単位で取得<br />&nbsp; String h = String(time / 3600); // 「時」を文字列にして取得<br />&nbsp; String m = String((time % 3600) / 60); // 「分」を文字列にして取得<br />&nbsp; String s = String(time % 60); // 「秒」を文字列にして取得<br /><br />&nbsp; Serial.println(String(h + &quot;:&quot; + m + &quot;:&quot; + s)); // 整形して送信<br />&nbsp; delay(1000); // 1 秒待って繰り返し<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.ne.jp/images/202201301535431-admin.png" alt="202201301535431-admin.png"><br />これは Arduino が動作開始してからの時間を延々と表示し続けるってものです　動作開始してからの時間をミリ秒で取得できる millis() 関数を使い…そこで得られた変数の値を人の目で確認しやすい(と思われる)「時:分:秒」に整形して表示しています　こんな感じで変数の内容を確認できるんでデバッグなどでは大いに助かりますね！<br /><br />　　：<br /><br />シリアルモニタには Arduino に対して文字を送信する機能も備えられています　それを Arduino 側から Serial.read() などを使って読み取るわけですが…基本的に「1文字づつ」送られてくる扱いになるようです<br />例えば「a10Z」と送信すれば「a」と「1」と「0」と「Z」に「設定した改行コード」が加えられて順番に送られてきます<br /><br />あと文字は「文字コード」として送られてきます　「a」だと「97 (0x61)」となり「1」だと「49 (0x31)」となり「0」だと「48 (0x30)」となり「Z」だと「90 (0x5A)」で…最後に「改行コード(LF)」が「10 (0x0A)」って感じになります<br />デバッグ時に「ループ回数の変数をプログラム実行中に指定の値に変更したい」とかの場合だとシリアルモニタから送られてきた「文字」を「数値」に変換する必要があります<br /><br />----------<br /><br />void setup() {<br />&nbsp; Serial.begin(9600); // シリアル通信を開始する<br />}<br />&nbsp;<br />void loop() {<br />&nbsp; if (Serial.available() &gt; 0) // 文字(列)が送信されてきた？<br />&nbsp; {<br />&nbsp;&nbsp; &nbsp;byte data = (Serial.read()); // 送信されてきた文字を読み込む<br />&nbsp;&nbsp; &nbsp;if (data &gt;= &apos;0&apos; && data &lt;= &apos;9&apos;) { // 文字は数字か？<br />&nbsp;&nbsp; &nbsp; &nbsp;data = data - &apos;0&apos;; // 文字コードを数値に変換<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(&quot;数字が入力された &#91;&quot; + String(data) + &quot;&#93;\n&quot;);<br />&nbsp;&nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp; &nbsp;if (data == 10) { // 改行コードは表示に不都合があるんで<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; data = 0; // 何も表示しないようにしておく<br />&nbsp;&nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(&quot;数字以外 &#91;&quot; + String((char)data) + &quot;&#93;\n&quot;);<br />&nbsp;&nbsp; &nbsp; &nbsp;data = 0; // 数字以外は「0」と扱うことにする<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;for (int i=1; i &lt;= data; i++){ // 送信された数値の数だけループしてみる<br />&nbsp;&nbsp; &nbsp; &nbsp;Serial.print(String(data) + &quot; 回ループの &quot; + String(i) + &quot; 回目\n&quot;);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.ne.jp/images/202201301535433-admin.png" alt="202201301535433-admin.png"><br />シリアルモニタに適当な適当な文字(列)を入力して「送信」します<br /><br /><img class="embeddedimage " width="850" height="426" src="https://room.dengeki.ne.jp/images/202201301535432-admin.png" alt="202201301535432-admin.png"><br />送信した文字に「数値」があればその数だけ for() のループ回数を変更します　「数値」以外の文字は処理しないようにしてあります<br />なお「1文字づつ」送られてくるってのが少々厄介で…「10以上の数値」を扱う場合にはひと工夫必要です　どうしたらいいんだろう？　先に送られてきた数値を10倍してそこに新たに送られてきた数値を足すって流れになるのでしょうか　ちょっと大掛かりになってくるっていうか面倒なんで今回はスルーしときますが概ねそんな流れになると思います（汗<br /><br />そんなこんなな Arduino のシリアル通信なお話でした　しょーみもっと早く知っとっけばよかった！って思いつつ書いてましたとさ（瀧汗 <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a><br /><br />　　：<br /><br />※ 追記 ※<br />「いやいや Arduino でも sprintf() って使えるじゃん？」ってタレコミを頂いんたんでよくよく調べたらありました（汗　参照している <a class="url labeledlink" href="http://www.musashinodenpa.com/arduino/ref/index.php" rel="noopener noreferrer" target="_blank">Arduino リファレンス</a> にはその辺が載ってなかったんで…無いものとばっか思ってました<br /><br />他にも数値かどうか？を判定する isDigit() や改行の判定に使ってたものを isPrintable() に置き換えられるようなものもありました<br />上で説明してる数値を変数に代入して云々…で書いてるものもこんな感じでできそうです<br /><br />&nbsp;&nbsp; &nbsp;if (data &gt;= &apos;0&apos; && data &lt;= &apos;9&apos;) { // 文字は数字か？<br />　　　　　　　　↓<br />&nbsp;&nbsp; &nbsp;if (isDigit(data)) { // 文字は数字か？<br /><br />----<br /><br />&nbsp;&nbsp; &nbsp; &nbsp;if (data == 10) { // 改行コードは表示に不都合があるんで<br />　　　　　　　　↓<br />&nbsp;&nbsp; &nbsp; &nbsp;if (!isPrintable(data)) { // 改行コード等は表示に不都合があるんで<br /><br />いやはや勉強になりました！　興味本位でなんとなく始めた Arduino ってことでまだまだ知らないことだらけなんで…こうして知識が広がっていくのは楽しいです　どもありがとございました！(&gt;_&lt;)ｗ -- Posted by 猫山ぽるか 〔3825文字〕 No.19 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=19</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=19</guid>
	<category>info</category>
	<pubDate>Sun, 30 Jan 2022 15:35:43 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino Leonardo (Pro Micro) で… ]]></title>
	<description><![CDATA[ Arduino Leonardo (Pro Micro) でマルチメディアキーボードを作ろう！<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.ne.jp/images/20211203181404-admin.jpeg" alt="20211203181404-admin.jpeg"><br />　<br />前回に引き続き Arduino 的な諸々をひとつって事で…マルチメディア・キーボードって云うんですかね？<br /><img class="embeddedimage " width="640" height="480" src="https://room.dengeki.ne.jp/images/20211114113829-admin.png" alt="20211114113829-admin.png"><br />＋α的に実装されている音量調節などのキーとかノート PC でよく見かける Fn キーと併用して使える再生とか早送りなどのキーを ATmega32U4 を搭載した Arduino Leonardo (Pro Micro) でどうにかしてみるお話です<br /><br />そんな今回の実験の様子<br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202111141138293-admin.jpeg" alt="202111141138293-admin.jpeg"><br />以前のマウスクリック超連射実験の回路がくっついたままなんで判りにくいですよね…<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/202111141138291-admin.png" alt="202111141138291-admin.png"><br />申し訳程度に回路図を描いてみたけど…それでも判りづらいですよね（汗　まぁとにかく 2 番ピンと 3 番ピンを使用しました<br /><br />今回のマルチメディア・キーボード(？)的な機能を簡単に実装するためにライブラリを追加してみました<br /><img class="embeddedimage " width="1000" height="982" src="https://room.dengeki.ne.jp/images/202111141138292-admin.jpeg" alt="202111141138292-admin.jpeg"><br />Arduino IDE で &#91;スケッチ&#93; → &#91;ライブラリをインクルード&#93; → &#91;ライブラリ管理&#93; してライブラリ管理画面を出す<br /><br /><img class="embeddedimage " width="1000" height="982" src="https://room.dengeki.ne.jp/images/202111141138291-admin.jpeg" alt="202111141138291-admin.jpeg"><br />目的のライブラリを「hid」ってキーワードで検索して…出てきた「HID-Project」をインストールする　※画面は既にインストール済みだけどまぁそんな感じで（汗<br /><br />後は Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます<br /><br />----------<br /><br /><span class="decorationC" style="color:darkgray;">// include the HID library</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;include</span> <span class="decorationC" style="color:deepskyblue;">&quot;HID-Project.h&quot;</span> <span class="decorationC" style="color:darkgray;">// 今回インストールしたやつをインクルードする</span><br /><br /><span class="decorationC" style="color:darkgray;">// definitions for each pin used</span><br /><span class="decorationC" style="color:orange;">const int</span> pinLed = LED_BUILTIN;<br /><span class="decorationC" style="color:orange;">const int</span> playButton = <span class="decorationC" style="color:deepskyblue;">2</span>; <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br /><span class="decorationC" style="color:orange;">const int</span> fwdButton = <span class="decorationC" style="color:deepskyblue;">3</span>; <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br /><span class="decorationC" style="color:orange;">const int</span> backButton = <span class="decorationC" style="color:deepskyblue;">4</span>; <span class="decorationC" style="color:darkgray;">// 以下今回は使わない(-_-；)</span><br /><span class="decorationC" style="color:orange;">const int</span> volUpButton = <span class="decorationC" style="color:deepskyblue;">5</span>;<br /><span class="decorationC" style="color:orange;">const int</span> volDwnButton = <span class="decorationC" style="color:deepskyblue;">6</span>;<br /><span class="decorationC" style="color:orange;">const int</span> muteButton = <span class="decorationC" style="color:deepskyblue;">7</span>;<br /><br /><br /><span class="decorationC" style="color:orange;">void</span> setup() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">// define the pin mode for each pin used</span><br />&nbsp;&nbsp;pinMode(pinLed, OUTPUT);<br />&nbsp;&nbsp;pinMode(playButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br />&nbsp;&nbsp;pinMode(fwdButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 今回使うピン番号</span><br />&nbsp;&nbsp;pinMode(backButton, INPUT_PULLUP); <span class="decorationC" style="color:darkgray;">// 以下今回は使わない(-_-；)</span><br />&nbsp;&nbsp;pinMode(volUpButton, INPUT_PULLUP);<br />&nbsp;&nbsp;pinMode(volDwnButton, INPUT_PULLUP);<br />&nbsp;&nbsp;pinMode(muteButton, INPUT_PULLUP);<br /><br />&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">// begin HID connection</span><br />&nbsp;&nbsp;Consumer.begin();<br />}<br /><br /><span class="decorationC" style="color:orange;">void</span> loop() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span> (!digitalRead(playButton)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, HIGH); <span class="decorationC" style="color:darkgray;">// turn on LED</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Consumer.write(MEDIA_PLAY_PAUSE); <span class="decorationC" style="color:darkgray;">// 一時停止・再生的なコマンド</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">500</span>); <span class="decorationC" style="color:darkgray;">// 動作確認用の LED 点滅</span><br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, LOW); <span class="decorationC" style="color:darkgray;">// turn off LED</span><br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span> (!digitalRead(fwdButton)) {<br />&nbsp;&nbsp;&nbsp; digitalWrite(pinLed, HIGH);<br />&nbsp;&nbsp;&nbsp;&nbsp;Consumer.write(MEDIA_NEXT); <span class="decorationC" style="color:darkgray;">// 次の曲的なコマンド</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">500</span>); <span class="decorationC" style="color:darkgray;">// 動作確認用の LED 点滅</span><br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(pinLed, LOW);<br />&nbsp;&nbsp;}<br />}<br /><br />----------<br /><br /><img class="embeddedimage " width="1920" height="1230" src="https://room.dengeki.ne.jp/images/20211114113829-admin.jpeg" alt="20211114113829-admin.jpeg"><br />Ubuntu 20.04.3 LTS と Audacious 3.10.1 で動作チェックしたところ…「再生/一時停止」と「次の曲」の動作をタクトスイッチの押下にて実現できました　やったね！<br /><br />わりと入手しづらいイメージのマルチメディア・キーボード(？)の拡張部分を Arduino Leonardo (Pro Micro) でどうにかできる事が判明しました　後は程よいケースとスイッチを用意すれば完成なんだけど…それはまた後の話ってかんじで<br /><br />　　：<br /><br />他にも機能があるっていうか…キーコードは Arduino/libraries/HID-Project/src/HID-APIs/ConsumerAPI.h に定義されています　※ファイルの場所は環境によって異なる場合があります<br /><br />enum ConsumerKeycode : uint16_t {<br />&nbsp;&nbsp;// Some keys might only work with linux<br />&nbsp;&nbsp;CONSUMER_POWER = 0x30,<br />&nbsp;&nbsp;CONSUMER_SLEEP = 0x32,<br /><br />&nbsp;&nbsp;MEDIA_RECORD = 0xB2,<br />&nbsp;&nbsp;MEDIA_FAST_FORWARD = 0xB3,<br />&nbsp;&nbsp;MEDIA_REWIND = 0xB4,<br />&nbsp;&nbsp;<span class="decorationC" style="color:red;">MEDIA_NEXT</span> = <span class="decorationC" style="color:blue;">0xB5</span>,<br />&nbsp;&nbsp;MEDIA_PREVIOUS = 0xB6,<br />&nbsp;&nbsp;MEDIA_PREV = 0xB6, // Alias<br />&nbsp;&nbsp;MEDIA_STOP = 0xB7,<br />&nbsp;&nbsp;<span class="decorationC" style="color:red;">MEDIA_PLAY_PAUSE</span> = <span class="decorationC" style="color:blue;">0xCD</span>,<br />&nbsp;&nbsp;MEDIA_PAUSE = 0xB0,<br /><br />&nbsp;&nbsp;MEDIA_VOLUME_MUTE = 0xE2,<br />&nbsp;&nbsp;MEDIA_VOL_MUTE = 0xE2, // Alias<br />&nbsp;&nbsp;MEDIA_VOLUME_UP = 0xE9,<br />&nbsp;&nbsp;MEDIA_VOL_UP = 0xE9, // Alias<br />&nbsp;&nbsp;MEDIA_VOLUME_DOWN = 0xEA,<br />&nbsp;&nbsp;MEDIA_VOL_DOWN = 0xEA, // Alias<br /><br />&nbsp;&nbsp;CONSUMER_BRIGHTNESS_UP = 0x006F,<br />&nbsp;&nbsp;CONSUMER_BRIGHTNESS_DOWN = 0x0070,<br /><br />&nbsp;&nbsp;CONSUMER_SCREENSAVER = 0x19e,<br /><br />&nbsp;&nbsp;CONSUMER_PROGRAMMABLE_BUTTON_CONFIGURATION = 0x182,<br />&nbsp;&nbsp;CONSUMER_CONTROL_CONFIGURATION = 0x183,<br />&nbsp;&nbsp;CONSUMER_EMAIL_READER = 0x18A,<br />&nbsp;&nbsp;CONSUMER_CALCULATOR = 0x192,<br />&nbsp;&nbsp;CONSUMER_EXPLORER = 0x194,<br /><br />&nbsp;&nbsp;CONSUMER_BROWSER_HOME = 0x223,<br />&nbsp;&nbsp;CONSUMER_BROWSER_BACK = 0x224,<br />&nbsp;&nbsp;CONSUMER_BROWSER_FORWARD = 0x225,<br />&nbsp;&nbsp;<span class="decorationC" style="color:green;">CONSUMER_BROWSER_REFRESH</span> = <span class="decorationC" style="color:blue;">0x227</span>,<br />&nbsp;&nbsp;CONSUMER_BROWSER_BOOKMARKS = 0x22A,<br /><br />今回使った <span class="decorationC" style="color:red;">MEDIA_PLAY_PAUSE</span> と <span class="decorationC" style="color:red;">MEDIA_NEXT</span> の他にもいろいろあります　例えば <span class="decorationC" style="color:green;">CONSUMER_BROWSER_REFRESH</span> を超連打して…いわゆる F5 アタックを実装するのもいいかもしれません　※やめて！(&gt;_&lt;)ｑ<br /><br />　　：<br /><br />まぁざっくりこんな感じですかね　これを用いてちょっと便利な補助キーボードを作れるとイイナ！ <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔3322文字〕 No.8 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=8</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=8</guid>
	<category>info</category>
	<pubDate>Sun, 14 Nov 2021 11:38:29 +0900</pubDate>
</item>
<!-- One Entry Data for RSS Feed -->
<item>
	<title><![CDATA[ Arduino Leonardo (Pro Micro) で… ]]></title>
	<description><![CDATA[ Arduino Leonardo (Pro Micro) でマウスクリック連射装置を作ろう！<br /><img class="embeddedimage " width="200" height="200" src="https://room.dengeki.ne.jp/images/20211203180938-admin.jpg" alt="20211203180938-admin.jpg"><br />　<br />ワンボードマイコンっていうか…ここんとこ Arduino が人気沸騰で気になりますよね！って事なんでモノは試しに安っすい <a class="url labeledlink" href="https://www.amazon.co.jp/gp/product/B086GPX434" rel="noopener noreferrer" target="_blank">VKLSVAN Pro Micro USB ATmega32U4</a> を買ってぼちぼちイジってみることにしました<br /><br /><img class="embeddedimage " width="1422" height="800" src="https://room.dengeki.ne.jp/images/202111130723461-admin.jpeg" alt="202111130723461-admin.jpeg"><br />まぁなんか Arduino にもいろいろあるようで…その中で ATmega32U4 を搭載した Arduino Leonardo と呼ばれるものが HID 機能を搭載しているって事で気になっていました　そんな Arduino Leonardo の互換機が今回購入した Pro Micro って感じです<br />その HID 機能とはなんぞや？って話ですがまぁざっくり PC の標準的なキーボードやマウスを指すようです　要するに USB 接続した Arduino Leonardo (Pro Micro) がキーボードやマウスに化けるって事なんですね<br />そこで今回は連打系ブラウザゲーとして名高い <a class="url labeledlink" href="https://natto0wtr.web.fc2.com/CookieClicker/" rel="noopener noreferrer" target="_blank">CookieClicker</a> を超連射できるボタンを実装してみることにしました<br /><br /><img class="embeddedimage " width="1000" height="957" src="https://room.dengeki.ne.jp/images/20211113072346-admin.jpg" alt="20211113072346-admin.jpg"><br />そんな Pro Micro のピン配列図　なんかいろいろ書いてあるけど…単純な On/Off スイッチを付ける場合は <span class="decorationM" style="background-color:teal;">　<span class="decorationC" style="color:white;">Arduino</span>　</span> と色付けされた 0 から 20 までのピンを使うようです<br /><br /><img class="embeddedimage " width="1067" height="800" src="https://room.dengeki.ne.jp/images/20211113072346-admin.png" alt="20211113072346-admin.png"><br />それを今回はこんな感じで 10 番ピンに配線しました<br />そしてお次はそれを制御するプログラムで…<br /><br />----------<br /><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define RX_LED 17</span> <span class="decorationC" style="color:darkgray;">// RX LED はポート 17 っぽい？</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define TX_LED 30</span> <span class="decorationC" style="color:darkgray;">// TX LED はポート 30 っぽい？</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;define SW 10</span> <span class="decorationC" style="color:darkgray;">// スイッチ用</span><br /><span class="decorationC" style="color:cornflowerblue;">&#35;include</span> <span class="decorationC" style="color:deepskyblue;">&lt;Mouse.h&gt;</span> <span class="decorationC" style="color:darkgray;">// マウス機能を使いたい</span><br /><br /><span class="decorationC" style="color:orange;">void</span> setup() {<br />&nbsp;&nbsp;pinMode(SW, INPUT_PULLUP);<br />&nbsp;&nbsp;Mouse.begin();<br />}<br /><br /><span class="decorationC" style="color:orange;">void</span> loop() {<br />&nbsp;&nbsp;<span class="decorationC" style="color:firebrick;">if</span>(!digitalRead(SW)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(TX_LED, LOW); <span class="decorationC" style="color:darkgray;">// TX LED を点灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//Mouse.click();</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(100);</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Mouse.press(MOUSE_LEFT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(17); // 最速</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">20</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;Mouse.release(MOUSE_LEFT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span class="decorationC" style="color:darkgray;">//delay(9); // 最速</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">10</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(TX_LED, HIGH); <span class="decorationC" style="color:darkgray;">// TX LED 消灯</span><br />&nbsp;&nbsp;} <span class="decorationC" style="color:firebrick;">else</span> {<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(RX_LED, LOW); <span class="decorationC" style="color:darkgray;">// RX LED を点灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">40</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;digitalWrite(RX_LED, HIGH); <span class="decorationC" style="color:darkgray;">// RX LED 消灯</span><br />&nbsp;&nbsp;&nbsp;&nbsp;delay(<span class="decorationC" style="color:deepskyblue;">20</span>);<br />&nbsp;&nbsp;}<br />}<br /><br />----------<br /><br />Arduino IDE でこんな感じのを用意してそれをマイコンボードに書き込みます　書き込まれた後に直ちに動作を開始します<br />スイッチが Off の時には基板上の LED が細かく点滅しています　スイッチを On にするとマウスクリックの連射が始まります<br /><br />マウスのクリックには Mouse.click(); って関数と Mouse.press(); Mouse.release(); とを選べるようです<br />Mouse.click(); は…いい感じに「押して離す」をまとめて実行できるようです<br />Mouse.press(); は…ドラッグ操作っていうんですかね　この関数を実行するとマウスボタンが押されたままになり Mouse.release(); を実行するとマウスボタンが離されます<br /><br />どちらの関数をどのようなタイミングで繰り返すかは個々の環境によって違うかと思いますが…<br /><img class="embeddedimage " width="1288" height="997" src="https://room.dengeki.ne.jp/images/20211113072346-admin.jpeg" alt="20211113072346-admin.jpeg"><br />我が家の環境では Mouse.press(); Mouse.release(); を使って 1 秒間に 38 連射を記録しました → <a class="url labeledlink" href="https://www.usamimi.info/~geko/arch_pro/0x002_js/05_mouse/" rel="noopener noreferrer" target="_blank">マウスクリック連射速度テスト</a><br />高橋名人もびっくりな超高速連射を実装できて満足しました！<br /><br />Arduino Leonardo (Pro Micro) の HID 機能は手軽に有用な機能を実装できてなかなか楽しいです　またぼちぼちイジっていきたいと思いました <a href="https://room.dengeki.ne.jp/tegalog.cgi?tag=%41%72%64%75%69%6e%6f" class="taglink" title="Arduino">#Arduino</a> -- Posted by 猫山ぽるか 〔1926文字〕 No.7 ]]></description>
	<link>https://room.dengeki.ne.jp/tegalog.cgi?postid=7</link>
	<guid>https://room.dengeki.ne.jp/tegalog.cgi?postid=7</guid>
	<category>info</category>
	<pubDate>Sat, 13 Nov 2021 07:23:46 +0900</pubDate>
</item>

	<!-- END ENTRIES -->
</channel>
</rss>

