<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>低価格コクピットの自作 &#8211; Macな暮らし</title>
	<atom:link href="https://polo-web.com/category/building-a-low-cost-cockpit/feed/" rel="self" type="application/rss+xml" />
	<link>https://polo-web.com</link>
	<description></description>
	<lastBuildDate>Mon, 06 Apr 2026 03:03:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://polo-web.com/wp-content/uploads/2025/03/site-icon-150x150.png</url>
	<title>低価格コクピットの自作 &#8211; Macな暮らし</title>
	<link>https://polo-web.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>X-Plane11自作プラグイン</title>
		<link>https://polo-web.com/x-plane11-custom-plugin/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Fri, 10 Oct 2025 01:55:11 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<category><![CDATA[Flight Simulator]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=16570</guid>

					<description><![CDATA[MacとWindows用のX-Planeプラグインです。Linuxはありません。エンジンスタート＆オートパイロットプラグインKingAirC90B-AP：  …]]></description>
										<content:encoded><![CDATA[
<p>MacとWindows用のX-Planeプラグインです。Linuxはありません。<br><br>エンジンスタート＆オートパイロットプラグイン<br>KingAirC90B-AP： <a href="https://polo-web.com/download/x-plane-kingairc90b-ap-plugin/">ダウンロード先</a><br><br>エンジンスタート＆オートパイロット&amp;コクピットの数値を変更するプラグイン<br>Boeing 737-800_AP <a href="https://polo-web.com/download/x-plane-boeing-737-800_ap-plugin/">ダウンロード先</a><br><br>パイロットの目線を10個まで簡単に記憶設定できるプラグイン<br>Pilot View Memory <a href="https://polo-web.com/download/x-plane-pilotviewmemory-plugin/">ダウンロード先</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>B 737-800 オートパイロットパネル</title>
		<link>https://polo-web.com/b-737-800-autopilot-panel/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 06:02:43 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<category><![CDATA[Flight Simulator]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=16445</guid>

					<description><![CDATA[B777 Wordliner配線図代表的な部品ABCDの４つ、それぞれ1点ずつ選んだ基本配線です。Teensyのピンはここで作成しているプログラムに沿ってピ …]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="783" height="609" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-52.jpg" alt="" class="wp-image-16447" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-52.jpg 783w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-52-300x233.jpg 300w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-52-768x597.jpg 768w" sizes="(max-width: 783px) 100vw, 783px" /></figure>



<p><strong>B777 Wordliner</strong><strong>配線図</strong><br>代表的な部品ABCDの４つ、それぞれ1点ずつ選んだ基本配線です。Teensyのピンはここで作成しているプログラムに沿ってピンを選んでいますが、ピンはどれを選んでも問題ありません。好きなピンを選んでプログラムにそのピン番号を指定するだけです。<br>この配線の中のスイッチにはプルアップ抵抗として10KΩが入っていますが、使用しないでも動作します。Teensyには全てのピンにプルアップ抵抗が内蔵されています。ただし、プログラム内でpinMode() で INPUT_PULLUPを入れる必要があります。しかし、これは普通にプログラム内で使用しているので何も新しく入れる必要もありません。<br>pinMode(PIN_D7, INPUT_PULLUP);<br>配線はスイッチの片方はGNDに繋ぎ、片方はTeensyのピンに直接繋ぎます。それだけです。しかし体験上、基盤に抵抗を入れてプルアップを実現する方が安定していていいように思います。<br>右端の点線で囲んだ部分は74HC595を使って、Teensy++2.0の43、44、45の3本のピンだけで沢山のLEDをコントロールするために作成した部分で、これがあると非常に重宝します。</p>



<p><strong>実際のパネルの作成手順<br></strong>今回作成手順を紹介したのは下の画像の中央部分、Boeubg 777 Wordlinerの名前が入ったパネルです。&nbsp;<br>アルミ板で作成したのでかなりカッコよくなりました。<br>上の方にあるのは7セグメントを使ってX-Planeと同期して5種類の数値を表示しています。今回はこの説明はしていません。他のページでやる予定にしています。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="567" height="368" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445.jpg" alt="" class="wp-image-16501" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445.jpg 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-300x195.jpg 300w" sizes="(max-width: 567px) 100vw, 567px" /></figure>



<p>パネルを開けた中の左に見えているのがこのプロジェクトの心臓部になるTeensy++2.0で、X-Planeと交信してデータを取得したり、送ったっリするメインのボードになります。<br>右側がteensyの少ないピン数でLEDを点灯させる為のシフトレジスタ74HC595です。<br>このおかげで、Teensy3本のピン使用で全てのLEDをコントロールできます。74HC595を増やせば多くのLEDをON/OFFできます。ここでは3個使用しています。<br>それぞれコードで表のパネルと繋がっています。<br><br>一番下に黄土色で見えるパネルはX-Planeをキーボードでコントロールする代わりに、これを使用するために作成しました。<br>このボードはMDF（中質繊維板）とか名前がついています。ホームセンターとかに売っているので手に入れるのも簡単です。<br>木材を圧縮して固めた素材で、非常に加工が楽で、そこそこ強度もあり、パネル板としても使用できます。アルミ板に比べると、スイッチを押した感じがカチッとした感触にならないぐらいで試験的にやる分には十分使えます。このX-Planeパネルの底板も同じものです。<br>一番最初にこのコクピットパネルを作るときはこれがお薦めです。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="567" height="514" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-51.png" alt="" class="wp-image-16448" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-51.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-51-300x272.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="341" height="305" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-50.jpg" alt="" class="wp-image-16449" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-50.jpg 341w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-50-300x268.jpg 300w" sizes="auto, (max-width: 341px) 100vw, 341px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="340" height="239" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-49.jpg" alt="" class="wp-image-16450" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-49.jpg 340w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-49-300x211.jpg 300w" sizes="auto, (max-width: 340px) 100vw, 340px" /></figure>



<p>色々、試行錯誤しながらやっているのでまだまだ裏の方の見た目（下の画像）はイマイチです。<br>サイドの壁はなくてもまったく問題ないので作成していません。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="284" height="264" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-48.jpg" alt="" class="wp-image-16451"/></figure>



<p>Boeing 777 Worldlinerのパネル、表面から見た完成品。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="168" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-47.jpg" alt="" class="wp-image-16452" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-47.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-47-300x101.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>100✕300mm、1.5mm厚のアルミ板を使っています。今回の場合、2mm厚だとタクトスイッチの押下げ隙間がなくなり、カチッと動作しなくなります。1.5mm厚のこの0.5mmの差でプッシュすることが何とかできる予定でしたが、実際はうまくいかず苦労しました。その方法はこの後の方で説明します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="200" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-46.jpg" alt="" class="wp-image-16453" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-46.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-46-300x120.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>PCで文字等を作成してアルミ板に貼る透明の粘着シールです。これはかなり高粘着タイプのようで、一度貼ると貼り直しが難しいです。難しいですがこれくらいピッタリ貼り付くほうが綺麗に仕上がります。<br>一発勝負です。A４には２枚作成できるので、やりそこなったら残りの１枚を使用します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="400" height="400" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-45.jpg" alt="" class="wp-image-16454" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-45.jpg 400w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-45-300x300.jpg 300w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-45-150x150.jpg 150w" sizes="auto, (max-width: 400px) 100vw, 400px" /></figure>



<p>配置図を作成して透明の粘着シールにインクジェットのプリンタで印刷します。インクが乾くまでしばらく待ってアルミ板に台紙を剥がさずに貼り付けます。<br>この時点では、まだシールの糊面は下の台紙があるので貼り付きません、中央と四隅をセロテープでアルミ板に仮に貼り付けています。<br>この時点で予定の位置にピッタリと設置するのが重要です。貼り直しをしないように慎重にする必要があります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="201" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-44.jpg" alt="" class="wp-image-16455" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-44.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-44-300x121.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>一番小さい黒点は円の中心になり、ポンチを打つところになります。穴あけの一番重要な所になるので図面には必ずこの位置を設定する必要があります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-43.jpg" alt="" class="wp-image-16456" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-43.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-43-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>下の画面は先に穴を開けていますが、その場合は仮止めした状態で開けた穴と図面が合うように光に透かして見るといいでしょう。<br>しかし、この場合穴をアルミ板に開ける前に配置図は貼った方が間違いなくきれいに作成することができます。<br>しかし、貼った後、穴あけ作業などいろんなことをやっている粘着シートなど全面に傷が沢山でき、穴の廻りにはアルミのクズがいっぱいたまります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="284" height="240" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-42.png" alt="" class="wp-image-16457"/></figure>



<p>このシールを最初からA4に2枚作成しておいて、まずアルミ板に穴を開けておいてから最後に貼り直すと傷がなくなり綺麗に仕上がります。1枚目は作業用、2枚めで仕上げということになります。<br>しかし、これをやると穴の位置をピッタリ合わせるのに苦労することにもなります。なんどか失敗しながら、やり方を覚えるしかないでしょうね。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="340" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-41.jpg" alt="" class="wp-image-16458" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-41.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-41-300x204.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>位置決めが終了したら片側半分だけ仮止めのセロテープを外して、シールを台紙から剥がします。<br>カッターで下の台紙を切って分離します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-40.jpg" alt="" class="wp-image-16459" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-40.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-40-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>以下のシール貼りは、すでに穴が空いていますが、穴が空いていない状態だと思ってください。一度貼り終わって、あまりにもキズが表面にできたので貼り直しをしているところになります。<br><br>シール貼りの要領は、切り離したシールをはがし、はがしたところから外側に向けて指先で少しずつ丁寧に空気を追い出すように押さえていきます。<br>一度にやってしまうと必ず空気が入り込み失敗しますので、なるべく少しずつ外側に向かって押さえて行くのがベストです。<br>このやり方だと結構うまくいきます。半分ずつ中央から左右の外側に向かって貼っていくというわけですね。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-39.jpg" alt="" class="wp-image-16460" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-39.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-39-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>半分済んだら、今度は逆の方の台紙を剥がして同じように押さえていきます。半分が済むと後の半分は楽に作業ができるようになります。<br>とにかく空気が入らないように押さえていくのがコツです。穴を開けた廻りにバリがあると、必ずそこには空気がのこります。<br>ノブとかボタンで隠れるなら気にしなくてもいいかもしれません。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-38.jpg" alt="" class="wp-image-16461" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-38.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-38-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>張り込み作業の最後にところです。右向こうのシールの台紙を少しずつ引っ張りながら、空気が入らないように細心の注意を払ってシールを指先で押さえて作業がする必要があります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-37.jpg" alt="" class="wp-image-16462" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-37.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-37-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>シールを張り終えた状態。前後してしまいますが、これは穴あけ前の状態です。最初この状態から穴を開けると穴位置をピッタリ合わせて開けることができます。<br><br>穴を開ける中心位置にポンチで印を付けていきます。この作業重要です。適当にやるとかなり位置がずれてしまいますので慎重にやりましょう。<br>このシールで作成した図は、丸とかがラインの色が茶色になっていますが、色はグレーがいいです。我が家のプリンターのインクがダメなのかもしれませんが、色付きだとしばらく使っていると色落ちしてかなり薄くなってしまいます。黒色の文字はあんまり色落ちしません。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="222" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-36.jpg" alt="" class="wp-image-16463" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-36.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-36-300x133.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>ドリルで穴あけ作業をします。できればボール盤などしっかりした状態で作業した方が間違いないのですが、私は持っていないので電気ドリルで作業しました。<br><br>いきなりドリルを使うと位置がずれたりするので、まずこの精密ピンドリル（下の画像）ドリル経は0.5mmくらいの細いもので穴あけを開始します。<br>折れやすいので、力の入れ加減に注意して作業を行ってください。<br>それから徐々に大きいドリルに変更して少しずつ広げる方が、最後の仕上げでのバリを減らすこともできるし、中心がズレにくいということにもなります。<br>面倒でも徐々に広げるほうが位置ずれがなく、綺麗に仕上がります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="450" height="336" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-35.jpg" alt="" class="wp-image-16464" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-35.jpg 450w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-35-300x224.jpg 300w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>



<p>さらに大きい穴はドリルでは開けることができないので、トリマー（下の画像）を使って手作業で広げていきます。<br>アルミなので割と簡単に広げることができます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="175" height="175" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-34.jpg" alt="" class="wp-image-16465" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-34.jpg 175w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-34-150x150.jpg 150w" sizes="auto, (max-width: 175px) 100vw, 175px" /></figure>



<p>慎重にやったつもりですが、やはりセンターがずれてしまっている所があります。このずれが穴あけのとき、そのままずれた状態で完成してしまいます。<br>大きい穴は多少位置の修正はできますが、小さい穴は最初のポンチの位置が非常に重要です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="369" height="277" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-33.jpg" alt="" class="wp-image-16466" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-33.jpg 369w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-33-300x225.jpg 300w" sizes="auto, (max-width: 369px) 100vw, 369px" /></figure>



<p>穴あけの後、表面にバリが結構でています。これを平らにする必要があるのですが、ヤスリでやるのですがアルミの表面が傷ついてしまうので慎重にやる必要があります。<br>それでも結果、完成時には上に貼り付けたシールがかなり汚れたり、傷ついたりしますので、一度シールを全部剥がして、2枚めのシールと張り替える作業をして完成させています。<br>そのとき、位置がやはり少しずれてしまいますが、仕上がりの面でこの方が綺麗にできるので位置ピッタリはあきらめましょう。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="300" height="225" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-32.jpg" alt="" class="wp-image-16467"/></figure>



<p>シールを張った後、大きい穴は細いカッター等でシールを取ることができますが、3mmの穴はカッターでの作業が大変ですので半田ゴテを使って熱を利用して開けると簡単です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="425" height="278" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-31.jpg" alt="" class="wp-image-16468" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-31.jpg 425w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-31-300x196.jpg 300w" sizes="auto, (max-width: 425px) 100vw, 425px" /></figure>



<p>完成！　拡大して見ると少し見えるかもしれませんが、結構キズが付いています。貼ったシールが穴の周りに浮いたような状態になっています。<br>これは穴のバリが綺麗に取れていないのが原因ですが、平らに使用としたら平面が傷になるという難しい状況になります。<br>そこそこでやめたらこのようにシールが完全にピッタリと付かない状態になりました。<br>後で考えたのですが、最初からシールを張り替えるつもりなら、シールを傷つけてもアルミ板にキズが付かないなら、ここでバリを思い切って取ったらよかったかもしれません。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="212" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-30.jpg" alt="" class="wp-image-16469" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-30.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-30-300x127.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>最初のシールはキズがいっぱい付いてしまったので剥がした状態です。<br>キズ付けずにバリを取るのに苦労したので円が綺麗に仕上がっていませんが、ノブやスイッチのボタンで隠れるので問題ないでしょう。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="196" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-29.jpg" alt="" class="wp-image-16470" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-29.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-29-300x118.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>丸とかラインの色を墨50%位にしたものと張り替えました。<br>右側に仮止めしていたテープが残っています。シールの上だったので取り除いたら綺麗になりました。<br>左の丸円の中の穴はピッタリなるように慎重にやったつもりなんですが、結局このようにずれてしまっています。<br><br>これで基盤に部品を配置して部品とアルミのパネルに穴がピッタリ合う予定で作業を行いましたが、手作業でやるのはかなり難しいです。<br>業者に穴を一発で設計図どうり開けてもらえばいいのでしょうが、お金もかかりますので多少のズレはこれで我慢します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="213" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-28.jpg" alt="" class="wp-image-16471" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-28.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-28-300x128.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>裏面です。この面はバリを取るためにヤスリで思い切り削っているので傷がいっぱいできていますが、裏面なので問題ないですね。<br>ナットを12個取り付けています。ここに基盤を取り付けます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="198" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-27.jpg" alt="" class="wp-image-16472" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-27.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-27-300x119.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p><strong>基盤の作成</strong><br>基盤の作成作業に入ります。９５ｘ７２ｍｍの秋月のユニバーサル基板（1枚120円）です。<br>こういう配置にします。左右の基盤は少し下の位置にずらして作成しています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="224" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-26.jpg" alt="" class="wp-image-16473" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-26.jpg 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-26-300x119.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>ハンダを乗せる面です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="234" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-25.jpg" alt="" class="wp-image-16474" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-25.jpg 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-25-300x124.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>部品を仮配置してみる。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="166" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-24.jpg" alt="" class="wp-image-16475" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-24.jpg 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-24-300x88.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>この基盤に部品を配置していくわけですが、最初から綿密に位置関係を定義する必要があります。<br>アルミの穴あけとこの部品の位置がピッタリ合わないと穴の位置を広げたり、部品の位置を移動したり大変な苦労と時間のロスになり、何より仕上げが汚くなってしまいます。<br>そこで下のプリントのように基盤と同じ状態をPCで作成します。そして基盤の穴とプリントを透かしてみて穴がピッタリ合っているかをまず確認してから、部品の配置をPC上で行います。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="388" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-23.jpg" alt="" class="wp-image-16476" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-23.jpg 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-23-300x205.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>アルミ板の裏面で、ネジとナットをはめて3つの基盤を実際の位置に置いて配置します。<br>位置が決まったら、ナットを瞬間接着剤で仮止めします。仮止めなので接着剤は少しでいいです。<br>その時、ネジとナットが綺麗に垂直に無理なくハマるか確認をしてください。ナットの位置がずれるとネジを無理やりはめ込む状態になりナットが剥がれる可能性が出てきます。<br>ナットが剥がれないコツとして、ナットを配置する位置をヤスリで削って置くと、面が荒くなって接着がよくなります。<br>その後、瞬間接着剤が乾いたらネジを外して配置したナットだけにします。<br>その後は、エポキシのA液、B液、2液の混合タイプの強力接着剤を使ってアルミ板にナットをしっかり貼り付けます。<br>この接着は時間がかかるので作業を止める最後にするといいと思います。翌日にはしっかり固まっています。<br><br>2液混合タイプの強力接着剤を付けてナットを固定したところです。ナットの廻りにベッタリと塗って付けています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="333" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-22.jpg" alt="" class="wp-image-16477" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-22.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-22-300x200.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>以下の画像はナットの下のアルミ板を削っていない状態で2液混合タイプの強力接着剤で取り付けていますが、この状態ではネジを少し無理して回したりすると外れてしまいました。<br>ヤスリで削って接着剤がアルミ板をしっかりつかめる状態にするとかなりしっかり接着できます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="332" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-21.jpg" alt="" class="wp-image-16478" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-21.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-21-300x199.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>セットしたところ。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="188" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-20.jpg" alt="" class="wp-image-16479" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-20.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-20-300x113.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>ナットは基盤を挟むように上下に入れると、基盤の高さを微妙に調整できるようになるので便利です。上のナットはネジが短い場合は外してもかまいません。<br>この状態でアルミ板に接着して取り付けたナットと連結するわけです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="349" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-19.jpg" alt="" class="wp-image-16480" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-19.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-19-300x209.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>仮に配置しています。部品は後で外すので間違えないように基盤に穴の位置をマジックで印を付けています。<br>この時点でパネルの穴と合っているか確認します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="353" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-18.jpg" alt="" class="wp-image-16481" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-18.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-18-300x212.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>これはパネル正面から見て、右側のところですが全ての部品の配置と基板上の配線が終了したところです。<br>まだ、Teensyに繋ぐ配線がされていないのでスッキリしています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="347" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-17.jpg" alt="" class="wp-image-16482" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-17.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-17-300x208.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>中央の配置する基盤です。配線するとこんなに複雑になっています。スイッチ類やLEDの基本的な配線は非常に簡単なのですが、コードを使ってやるとこのようになってしまいます。<br>本来なら自作の基盤をちゃんと作成してやれば非常にスッキリなるのはよくわかっていますが、裏表ピッタリ合う両面の基盤の作成、穴あけとやはりかなり敷居はたかいのです。<br>お金もこのユニバーサル基板の方が安くてできます。しかしいずれは挑戦してみたいですね。自作の基盤作成。<br><br>スイッチ類、LEDこれがアルミのパネルの穴とピッタリ合う必要があります。基盤のどの穴に部品を配置するかコンピュータ上でしっかり図面を描いて、準備する必要があります。<br>適当に始めても絶対にうまくいきません。図面が全てです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="432" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-16.png" alt="" class="wp-image-16483" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-16.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-16-300x229.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>中央基盤の逆面です。左右にあるピンで他の基盤と繋いでいます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="545" height="426" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-14.png" alt="" class="wp-image-16485" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-14.png 545w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-14-300x234.png 300w" sizes="auto, (max-width: 545px) 100vw, 545px" /></figure>



<p>表のパネルから見ると左側にくる基盤です。この上にアルミ板パネルがかぶさってきます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="439" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-15.png" alt="" class="wp-image-16484" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-15.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-15-300x232.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>裏側からみるとこのようになります。<br>左画に2つ穴が空いていますがトグルスイッチを通すための穴です。本来なら基盤に直接付けたいのですが、これをやるとアルミ板パネルと基盤の間が離れすぎて、タクトスイッチのボタンが付けられなくなります。横位置から見た次の画像を見てください。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="401" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-13.png" alt="" class="wp-image-16486" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-13.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-13-300x212.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>下の画像では、右にタクトスイッチがあり、アルミ板の下にタクトスイッチのボタンが見えています。タクトスイッチは普通の状態でほとんど本体とボタンの隙間がないので押したときカチッと音がするには最低でも0.5mmくらいの隙間が必要です。アルミ板が1mmあるので隙間をつくるには1.5mmは必要です。<br>何故かこの大きい隙間のタクトスイッチが売ってないのです。<br>したがってトグルスイッチ（中央の赤い２つ）は幸いナットが付いているのでアルミ板に直接付けて、基盤に穴を開けて飛びだした状態にして基盤と繋いでいます。<br>つまり、タクトスイッチを基準にこのパネルと基盤の高さを設定しているということです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="225" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-12.png" alt="" class="wp-image-16487" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-12.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-12-300x119.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>パネル正面から見て右側にくる基盤です。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="436" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-11.png" alt="" class="wp-image-16489" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-11.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-11-300x231.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>上の基盤の裏側。中央付近にある基盤に穴が空いた位置に取り付けているのがロータリーエンコーダです。<br>これもタクトスイッチを基準にしたときに高さが合わなかったので穴を開けて無理やりロータリーエンコーダを穴側に押し下げています。<br>しかし、この取り付け方は間違っていました。ロータリーエンコーダは微妙な動きをする部品です。中央のHDGの数値の動きがおかしくなってしまいました。<br>やはりしっかり固定する必要があるようです。<br>高さを調整するとタクトスイッチの押し下げができなくなるので工夫が必要になります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="435" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-10.png" alt="" class="wp-image-16490" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-10.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-10-300x230.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>このピンソケットはLED専用で74HC595と接続するためのものです。秋月の分割ロングピンソケット２ｘ４２（８４Ｐ）を使用しています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="241" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-9.png" alt="" class="wp-image-16491" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-9.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-9-300x128.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>タクトスイッチ3つが並んでいます。スイッチ本体の上面がピッタリアルミ板にくっついているのがわかると思います。<br>アルミタの下にはタクトスイッチに付いているボタンが見えますがほとんど隙間がありません。この隙間が0.5mmくらいは必要なのに2mmのアルミ板では厳しいので1mmを使ったのですが、実際は取り付けがチョットおかしいとカチッとならないのです。そこで工夫したのがボタンをとりつける四角の突起に1mm厚の両面タープを貼り付けました。ボタン側に貼り付けてもかみません。2枚合計2mmでも大丈夫でした。これでどうにか切り抜けたのですが。これ以上高くするには四角の突起を継ぎ足して伸ばすしか方法がないのです。<br>色々ネットで調べてみましたが、この突起が高いのを見つけることができませんでした。自作で伸ばすしかないようです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="191" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-8.png" alt="" class="wp-image-16492" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-8.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-8-300x101.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>Teensyと繋ぐピンソケットです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="212" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-7.png" alt="" class="wp-image-16493" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-7.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-7-300x112.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>右側にLEDが見えますが、これは取り付けには問題なくかなり融通がきく部品です。ここでは3mmの穴に3mmの小さいLEDを直接差し込んでいます。<br>このLEDにブランケットを取り付けると仕上がりが綺麗にカッコよくなります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="175" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-6.png" alt="" class="wp-image-16494" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-6.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-6-300x93.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>中央に基盤を取り付けた状態です。トグルスイッチは直接パネルにナットで止めています。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="241" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-5.png" alt="" class="wp-image-16495" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-5.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-5-300x128.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>これは完成品です。全てをセットし後はコードをTeensyと繋ぐだけという状態です<br>3分割しているのは、ユニバーサル基板がピッタリサイズが無いということもありますが、メンテンスのことも考えています。1箇所の修正のとき全てを外さないで済むからです。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="234" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-4.png" alt="" class="wp-image-16496" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-4.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-4-300x124.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>ピンヘッダに接続線をハンダ付けしてピンソケットと繋いでいます。<br>これで後はプログラミンしたデータをTeensyにアップロードすればX-PlaneのB777Wordlinerのオートパイロット部分をコントロールできるようになります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="285" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-3.png" alt="" class="wp-image-16497" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-3.png 567w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-3-300x151.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>



<p>パネルに基盤をセットしてスイッチのボタンを繋ぎ、トグルスイッチをナットで止めて、小さいスイッチにもボタンをかぶせています。<br>最後にロータリーエンコーダのノブをセットして完成です。<br>かなり綺麗にしあがりました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-2.jpg" alt="" class="wp-image-16498" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-2.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-2-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>中央に３つあるロータリーエンコーダは左右の２つ（黒のノブ）がプッシュスイッチを持ったもので、中央（赤のノブ）はプッシュスイッチがありません。<br>B777Wordlinerも同じようにプッシュスイッチになっているのでその通りにしてみました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-1.jpg" alt="" class="wp-image-16499" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-1.jpg 500w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16445-1-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<p>後はArduinoを使ってプログラミングをTeensyボードにアップロードすれば完成です。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>B747-400 auto-pilot cockpit of X-Plane ロータリーエンコーダ</title>
		<link>https://polo-web.com/b747-400-auto-pilot-cockpit-of-x-plane-rotary-encoder/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 05:23:46 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<category><![CDATA[Flight Simulator]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=16440</guid>

					<description><![CDATA[ロータリーエンコーダ 　　 回路図は簡単ですが、Arduinoのスケッチがチョット複雑になりますし、その場所によって数値の設定方法が違うということで悩ましい …]]></description>
										<content:encoded><![CDATA[
<p><strong>ロータリーエンコーダ</strong></p>



<p class="has-text-align-center">　　<img loading="lazy" decoding="async" alt="X-Plane 10.42r1-3-2" src="blob:https://polo-web.com/7807aaf9-55d0-4f5d-afbd-d98f9cedb9bc" width="128" height="125"></p>



<p>回路図は簡単ですが、Arduinoのスケッチがチョット複雑になりますし、その場所によって数値の設定方法が違うということで悩ましいことになります。<br>しかし、下のスケッチをそのまま使用すれば全く問題なく動作します。<br><img loading="lazy" decoding="async" alt="RotaryEncoder.fzz - Fritzing - [ブレッドボード ビュー]" src="blob:https://polo-web.com/93ecceca-3e94-4fdf-9cde-eaff43a68e04" width="402" height="273"></p>



<p>この回路も本来ならば、プルアップやプルダウンを使った回路になるのですが、Teensy内蔵のプルアップ抵抗を使用するのでここでは一切使用しません。従って超簡単な回路になるのです。<br>その代わり、スケッチで必ず pinMode(FDSwPin,&nbsp;INPUT_PULLUP); の&nbsp;<strong>INPUT_PULLUP</strong>&nbsp;というオプションを指定します。<br>ロータリーエンコーダの場合、ピンが3本出ています、この場合は中央をGNDにしていますがメーカーによってこの位置が違うので注意が必要です。<br><br><strong>B747-400　ロータリーエンコーダ：SPD</strong>（Teensyのピンはどれでも可）<br>X-Plane画面のSELスイッチでノットとマッハを切り替えると、エンコーダもそれに合わせて数値を変化させることができます。<br>※下の例で、逆回転になる場合は、０ピンと１ピンの位置を変えると正回転になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ino" data-lang="Arduino"><code>//エンコーダで小数点以下からカウントアップ／ダウンする
#include &lt;Encoder.h&gt;
 
const int AirSpEncR_pin = 0;    //teensy０ピンと繋ぐ
const int AirSpEncL_pin = 1;    //teensy１ピンと繋ぐ
Encoder AirSpEnc(AirSpEncR_pin, AirSpEncL_pin);      //エンコーダピン
short AirSpEncPrev = 0;
     
//int mode = 0;
FlightSimFloat AirSpeed;
FlightSimInteger AirSpeed_mach;
     
void setup() {
  pinMode(AirSpEncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(AirSpEncL_pin, INPUT_PULLUP);  //エンコーダ
  AirSpeed = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed&quot;);
  AirSpeed_mach = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed_is_mach&quot;);
}
     
void loop() {
  FlightSim.update();
 
  // エンコーダの動きを見る
  short AirSpEncDiff = AirSpEnc.read() /4;  //粗いの変更したエンコーダを読む- 変更前のエンコーダの値
     
  // それらが移動した後のエンコーダをリセット
  if (AirSpEncDiff) {
    AirSpEncPrev = 0;
    AirSpEnc.write(0);
  }
   
  // encDiffは20にmyEncDiffの値（1カウント）を掛ける値になる
  int AirSpeed_mach_encDiff = 20 * AirSpEncDiff;  //20 ✕ 1 で encDiff は20になる
   
  if (AirSpeed_mach == 0) { 
    //小数点以下2桁からカウントアップ／ダウンを行う  
    if (AirSpeed_mach_encDiff) {      //もし20なら  
        float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
         
        // encDiffは20だから ✕ 0.05で1ずつカウント（１桁からカウント）となり、その値を周波数にプラスする
        tmp += AirSpeed_mach_encDiff * 0.05;  
        AirSpeed = tmp;
        //数値の範囲はX-Plane側で処理しているのでいらない
    }
  }
  if (AirSpeed_mach == 1) { 
    //小数点以下2桁からカウントアップ／ダウンを行う  
    if (AirSpeed_mach_encDiff) {      //もし20なら  
        float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
         
        // encDiffは20だから ✕ 0.00005で0.01ずつカウント（小数点以下２桁からカウント）となり、その値を周波数にプラスする
        tmp += AirSpeed_mach_encDiff * 0.0005;  
        AirSpeed = tmp;
        //数値の範囲はX-Plane側で処理しているのでいらない
    }
  }
} </code></pre></div>



<p><strong>B747-400　ロータリーエンコーダ：HDG</strong>（Teensyのピンはどれでも可）<br>※下の例で、逆回転になる場合は、２ピンと3ピンの位置を変えると正回転になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ino" data-lang="Arduino"><code>#include &lt;Encoder.h&gt;
   
const int HDGEncR_Rotation = 2;
const int HDGEncL_Rotation = 3;
Encoder HDGEnc(HDGEncR_Rotation, HDGEncL_Rotation);
short HDGEncPrev = 0;  //エンコーダの逆回転
   
FlightSimInteger HDG;
   
void setup() {
  pinMode(HDGEncR_Rotation, INPUT_PULLUP);  //エンコーダ
  pinMode(HDGEncL_Rotation, INPUT_PULLUP);  //エンコーダ
  HDG = XPlaneRef(&quot;sim/cockpit/autopilot/heading_mag&quot;);
}
   
void loop() {
  FlightSim.update();
   
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short HDGEncDiff = (HDGEnc.read() - HDGEncPrev) / 4;
   
  if (HDGEncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    HDGEncPrev = 0;
    HDGEnc.write(0);
   
    // datarefを一時的な値にコピー
    float heading = HDG;
 
    // 一時的な値に変更を適用
    heading += HDGEncDiff;
 
    // datarefへ検証された新しいエアースピードの数値を書く
    HDG = heading;
  }
}</code></pre></div>



<p><strong>B747-400　ロータリーエンコーダ：V/S</strong>（Teensyのピンはどれでも可）<br>※下の例で、逆回転になる場合は、9ピンと10ピンの位置を変えると正回転になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ino" data-lang="Arduino"><code>#include &lt;Encoder.h&gt;
   
const int VerticalSpEncR_Rotation = 4;
const int VerticalSpEncL_Rotation = 5;
Encoder VerticalSpEnc(VerticalSpEncR_Rotation, VerticalSpEncL_Rotation);
short VerticalSpEncPrev = 0;  //エンコーダの逆回転
   
FlightSimInteger VerticalSpeed;
//FlightSimInteger VerticalSpeedknob;
   
void setup() {
  pinMode(VerticalSpEncR_Rotation, INPUT_PULLUP);  //エンコーダ
  pinMode(VerticalSpEncL_Rotation, INPUT_PULLUP);  //エンコーダ
  VerticalSpeed = XPlaneRef(&quot;sim/cockpit/autopilot/vertical_velocity&quot;);
}
   
void loop() {
  FlightSim.update();
   
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short VerticalSpEncDiff = (VerticalSpEnc.read() - VerticalSpEncPrev) *100 / 4;
  if (VerticalSpEncDiff) {
    VerticalSpEncPrev = 0;
    VerticalSpEnc.write(0);
    float verticalSp = VerticalSpeed;
    verticalSp += VerticalSpEncDiff;
    VerticalSpeed = verticalSp;
  }
}</code></pre></div>



<p><strong>B747-400　ロータリーエンコーダ：ALT</strong>（Teensyのピンはどれでも可）<br>※下の例で、逆回転になる場合は、6ピンと7ピンの位置を変えると正回転になります。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ino" data-lang="Arduino"><code>#include &lt;Encoder.h&gt;
 
  const int ALTEnc_R_Pin = 6;
  const int ALTEnc_L_Pin = 7;
  Encoder AltEnc = Encoder(ALTEnc_R_Pin, ALTEnc_L_Pin);           //1、2 → 31、32ピン　Altitudeエンコーダ
  short AltEncPrev = 0;   
 
  FlightSimInteger Altitude;       //Altitude
 
 
void setup() {
  pinMode(ALTEnc_R_Pin, INPUT_PULLUP);
  pinMode(ALTEnc_L_Pin, INPUT_PULLUP);
 
  Altitude = XPlaneRef(&quot;sim/cockpit/autopilot/altitude&quot;);    //encoder
}
 
void loop() {
  FlightSim.update();
 
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short AltEncDiff = (AltEnc.read() - AltEncPrev) *100 /4;
   
  if (AltEncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    AltEncPrev = 0;
    AltEnc.write(0);
    // datarefを一時的な値にコピー
    float AltSp = Altitude;
    // 一時的な値に変更を適用
    AltSp += AltEncDiff;
    // 範囲チェックを行う
    while (AltSp &lt; 0) AltSp += 1;  //エアスピードが 0 より小さい場合は 1 をプラスする（つまり0で止まる）
    while (AltSp &gt;= 50001) AltSp -= 1;  //エアスピードが 50001 より大きい場合は 1 をマイナスする（つまり50000で止まる）
    // datarefへ検証された新しいエアースピードの数値を書く
    Altitude = AltSp;
  }
}</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>プルアップとプルダウン</title>
		<link>https://polo-web.com/pull-up-and-pull-down/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 03:48:47 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<category><![CDATA[Flight Simulator]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=16412</guid>

					<description><![CDATA[プルアップとプルダウン、これTeensyを扱うにおいて、最初に頭に入れて置きたい重要事項です。プルアップ抵抗またはプルダウン抵抗は、Teensyの入力にHI …]]></description>
										<content:encoded><![CDATA[
<p>プルアップとプルダウン、これTeensyを扱うにおいて、最初に頭に入れて置きたい重要事項です。<br>プルアップ抵抗またはプルダウン抵抗は、Teensyの入力にHIGH(5V)かLOW(0V)信号を 確実に伝える為に取り付けます。抵抗がない場合はHIGH/LOWの状態が不安定となり、Teesyが誤動作を起こす元になるので抵抗は必ず付けましょう。<br></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="207" height="256" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16412-2.jpg" alt="" class="wp-image-16413"/></figure>
</div>


<p>5Vからみて最初に抵抗が来て、スイッチ、GNDの順になります。</p>



<ul class="wp-block-list">
<li>スイッチが押されていない時は、GNDに流れません。抵抗を通して入ってきたTeensyのピン電圧は5Vになります。</li>



<li>スイッチが押された時は、GNDと繋がる。従ってTeensyのピンの電圧は0Vになります。</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="207" height="254" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16412-1.jpg" alt="" class="wp-image-16414"/></figure>
</div>


<p>5Vからみて最初にスイッチが来て、抵抗、GNDの順になります。<br>これは上と丁度逆の状態になります。</p>



<ul class="wp-block-list">
<li>スイッチが押されていない時は、GNDと繋がっているので、Teensyのピン電圧は0Vになります。</li>



<li>スイッチが押された時は、Teensyのピン電圧は5Vになります。</li>
</ul>



<p>実際にはLEDを扱う時に、ボタンを押したとき、点灯させるか、離した時、点灯させるかをこれでコントロール出来るようですね。<br><br><strong>しかし、下の方法だとこの回路がいらないとか？</strong><br>Teensyで内蔵プルアップ抵抗をＯＮさせる方法は、pinMode( )関数で行います。<br>pinMode(1, INPUT_PULLUP) ;　と言う感じで記述します。これで上の回路のように設定しなくても直接ピンに接続できるようになります。<br>下がその回路になります。Teensyのピンから直接スイッチに入っています。その間には抵抗が一切ありません。そのままGNDに繋がっていますね。これGND側でないと動作しません。<br><a href="http://mag.switch-science.com/2013/05/23/input_pullup/">ここに</a>詳しく説明されています。すごく分かりやすいので見てみてください。下の画像もそこからおかりしました。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="300" height="300" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16412.jpg" alt="" class="wp-image-16415" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16412.jpg 300w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16412-150x150.jpg 150w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>また、X-Planeでスイッチを押したとき、最初だけ反応しない場合があります。2度押すとスイッチが入ります。その後は順調ですが、最初反応しないのでチョット気になる場合があります。これはプルダウンで回路を作成してると思います。これをプルアップにすると問題なく最初からスイッチが入るようになります。<br>頭がこんがらかってしまいますが、スケッチとの関係もあるのかもしれません。もし、これでもダメなら逆にするとか……　まさに素人考えですね。<br><br>※ここに説明記事があります参考になるかも：http://mag.switch-science.com/2013/05/23/input_pullup/</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DataRefEditorについて</title>
		<link>https://polo-web.com/about-datarefeditor/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 09 Oct 2025 03:43:43 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=16406</guid>

					<description><![CDATA[DataRefEditor&#38;nbsp;は、X-Planeの 2000+ DataRef 値を表示し、変更することができる無料のプラグインです。コクピ …]]></description>
										<content:encoded><![CDATA[
<p>DataRefEditor&nbsp;は、X-Planeの 2000+ DataRef 値を表示し、変更することができる無料のプラグインです。<br>コクピットをTeensyボードを使って自作する上で重要な役割をはたします。<br>ーーーーーーーーーーーーーーーーーーーーーーーーーーーー<br>Contents</p>



<p>1 Downloading and Installing DataRefEditor<br>2 Viewing DataRefs<br>2.1 Art Controls and Sim Stats<br>3 Changing DataRefs<br>4 Adding Your Own DataRefs</p>



<p>ーーーーーーーーーーーーーーーーーーーーーーーーーーーー<br></p>



<p><strong>１、DataRefEditor をダウンロードしてインストールします。</strong><br>DataRefEditor は<a href="https://developer.x-plane.com/tools/datarefeditor/">ここから</a>ダウンロードすることができます。<br>DataRefEditorフォルダを、X-Plane/Resources/Plugins フォルダにドラッグしてインストールします。<br><strong><br>DataRefs の表示</strong><br>インストールが完了すると、ここに出てきます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="262" height="128" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16406-3.png" alt="" class="wp-image-16407"/></figure>



<p>次に出てくるメニューの一番上を選択すると「dataref」画面が表示されます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="131" height="52" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16406-2.png" alt="" class="wp-image-16408"/></figure>



<p>このように沢山のX-Planeの情報が表示されます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="359" height="268" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16406-1.png" alt="" class="wp-image-16409" srcset="https://polo-web.com/wp-content/uploads/2025/10/post-id-16406-1.png 359w, https://polo-web.com/wp-content/uploads/2025/10/post-id-16406-1-300x224.png 300w" sizes="auto, (max-width: 359px) 100vw, 359px" /></figure>



<p>この画面を見ながらX-planeの動きを観察します。例えば、上の赤枠のパスはB747-400のオートパイロットのスイッチにあたります。今、「2」と最後の数字がなっていますが、スイッチが入った状態です。OFFにすると、これが「0」に変化します。<br>自作したスイッチと、Arduinoのスケッチで、この数字の変化をコントロールすることになります。中には理由があってこの数字を変更できないdatarefもありますが、ほとんどのデータを扱うことが出来るようです。<br><br>DRE&nbsp;ウィンドウは、任意の余白をドラッグしてサイズ変更できます。ウィンドウは、画面上の任意の位置にドラッグできます。<br><br>選択するためにフィルターをかけるか、または小グループを検索するため、DataRefはDREウインドウの左下角に、DataRefの文字列名を入力します。<br>注: DRE は大文字小文字を区別します。たとえば「tire」を入力すると DataRef 名は「tire」を含む 25 以上の datarefs が表示されます。多くの値が変動することに注意してください。<br><br>ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー<br>以下の情報（その他の機能）は私自身まだよく理解していませんが、簡単に翻訳した分を一緒に記載して置きます。もっと詳しく知りたい場合は<br>説明先：http://wiki.x-plane.com/DataRefEditor<br>で調べて見てはいかがでしょうか。<br><br><br><br><strong><span class="ystdb-inline--larger">Art Controls and Sim Stats<br>アート&nbsp;コントロールと&nbsp;Sim&nbsp;の統計情報</span></strong><br><br>Besides the regular &#8220;show datarefs&#8221; display (which shows all of the datarefs in DataRefs.txt plus any datarefs intentionally published by other plugins), there are two other sets of datarefs that DataRef editor can show:<br><br>DataRefエディタが表示することができるのは、「show Datarefs」の表示のほかに、datarefsは他に２つのセットがあります（他のプラグインによって意図的に公開されるDataRefs.txtなど、プラスされたどんなdatarefsでも、datarefsのすべてを示している）。<br><br></p>



<ul class="wp-block-list">
<li>Art Controls（アート コントロール）</li>



<li>Stats（統計情報）</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="164" height="75" src="https://polo-web.com/wp-content/uploads/2025/10/post-id-16406.png" alt="" class="wp-image-16410"/></figure>



<p><br><br><br>どちらも、メニュー選択を使用すると「Show Art Controls」と「Show Stats」が表示されます。<br><br>Art Controlsは、 X-Planeによって、ドメインの sim/private/controls/&#8230;. にマップされます。<br>stats（統計情報）は、ドメインの sim/private/stats/&#8230;. にマップされます。<br><br>すべての sim-private datarefs （sim/private）、 これらの datarefs は文書化されていないと、サポートされないし、将来の構築に非公開になる場合があります。<br><br>プラグイン、パネル、またはオブジェクトは、任意の sim/private datarefs に依存しないでください！<br>これらは、diagnostics/debugging（診断/デバッグ）のみに使用する必要があります。<br><br>アート コントロール datarefs は、sim が変更されたとき動作が変更される datarefs です。たとえば、アート コントロールを使用して、billboarded lights（ビルボード ライト）のグローバルサイズを変更できます。<br><br>Sim&nbsp;統計 sim のパフォーマンスについての診断情報の膨大な量を提供します。たとえば、レンダリング負荷の計算の詳細統計情報を介して X 平面幾何学的なスループットを測定する方法について説明しますを参照してください。<br><br>統計とアート コントロール; のない 1 つの包括的なリストがあります。彼らは私たちの内部の開発プロセスとベータの間にデバッグを支援する sim で左の一部として生成されます。</p>



<p>Both are shown using the menu picks &#8220;Show Art Controls&#8221; and &#8220;Show Stats&#8221;.</p>



<p>The art controls are mapped into the domain sim/private/controls/&#8230;. by X-Plane.&nbsp;<br>The stats are mapped into the domain sim/private/stats/&#8230;.</p>



<p>Like all sim-private datarefs (sim/private) these datarefs are undocumented and unsupported and may not be there in future builds.</p>



<p>Your plugin, panel, or object should not depend on any sim/private datarefs! They should only be used for diagnostics/debugging.</p>



<p>The art control datarefs are datarefs that will change the operation of the sim when changed. For example, you can change the global size of billboarded lights using an art control.</p>



<p>The sim stats provide a huge amount of diagnostic information about the sim&#8217;s performance. For an example, see Calculating Rendering Load, which in detail explains how to measure X-Plane&#8217;s geometric throughput via the stats.</p>



<p>There is no one comprehensive list of stats and art controls; they are generated as part of our internal development process and left in the sim to aid in debugging during beta.</p>



<p>Changing DataRefs<br><strong>DataRefs&nbsp;</strong><strong>を変更するには。</strong></p>



<p>右または左をクリックして DataRef 値と新しい値を入力するほとんどの DataRefs の値を変更することができます。<br>飛行中またはランプ中 DataRef の変更の効果を観察することができます。<br>たとえば、sim/operation/failures/rel_tire1 の値を 0 から 1 に変更した場合、タイヤが縮小し小型機が側に傾くのを観察できますし、「tire blown!（タイヤのパンク）」の警告が表示されます。<br><br>Return&nbsp;キーを押してキーボード フォーカスを X-Planeに戻してください。<br><br>DataRefs&nbsp;の多くの項目は配列として格納されます。DRE ウィンドウの右下にスライダーを使用して、配列のインデックス値の 99 まで 1 によって事前に。たとえば、配列内のインデックスをインクリメントして x、y、および z の「重い」の 10 タイヤのそれぞれの方向でタイヤのたわみを確認できます。左のスライダーは 100 を配列のインデックスを進めます。<br><br>This will allow you to observe the effect of changing a DataRef while in flight or on the ramp. For example, if you change the value of sim/operation/failures/rel_tire1 from 0 to 1 you will observe that a small aircraft will tilt to the side as the tire deflates and the &#8220;tire blown!&#8221; warning appear.</p>



<p>Bring keyboard focus back to X-Plane by pressing return.</p>



<p>Many DataRefs items are stored as arrays. Use the slider on the bottom right of the DRE window to advance the array index by 1 up to a value of 99. For example, you can observe the tire deflection in the x, y, and z directions of each of the 10 tires on a &#8220;heavy&#8221; by incrementing the array index. The slider on the left advances the array index by 100.</p>



<p><strong>あなた自身の</strong><strong>&nbsp;DataRefs&nbsp;</strong><strong>を追加するには。</strong></p>



<p>DataRefEditor&nbsp;に datarefs を追加する 2 つの方法があります。<br></p>



<ul class="wp-block-list">
<li>Resources/pluginsの DataRefs.txt を編集することができます。これはdatarefsを加える最も簡単な方法です。しかし、X-Planeを更新するとき、インストーラは、変更内容を上書きします。このためにそれが動作するようにするため、プラグインは、DataRefEditorの前にロードされなければなりません。</li>



<li><a href="file:///Volumes/Silicon%20Power%201TB/%E6%9B%B8%E9%A1%9E-external/RapidWeaver/polo-web.com%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%83%8F%E3%82%99%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A/polo-web.com/X-Plane-DIY_HomeMade_CockpitPanel/DataRefEditor/www.xsquawkbox.net/xpsdk/mediawiki/DataRefEditorPlugin">ここで</a>解説されているように、プログラムで、あなたのdatarefsを公開することができます。http://<a href="file:///Volumes/Silicon%20Power%201TB/%E6%9B%B8%E9%A1%9E-external/RapidWeaver/polo-web.com%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%83%8F%E3%82%99%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%95%E3%82%9A/polo-web.com/X-Plane-DIY_HomeMade_CockpitPanel/DataRefEditor/www.xsquawkbox.net/xpsdk/mediawiki/DataRefEditorPlugin">www.xsquawkbox.net/xpsdk/mediawiki/DataRefEditorPlugin</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>X-Plane B777 Woldliner Arduinoプログラミング</title>
		<link>https://polo-web.com/x-plane-b777-woldliner-arduino-programming/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Sat, 06 Sep 2025 04:39:14 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=15271</guid>

					<description><![CDATA[X-Plane コクピットの自作に挑戦！ このプロジェクト、X-Plane B777 WoldlinerのオートパイロットーコックピットパネルのArduin …]]></description>
										<content:encoded><![CDATA[
<p>X-Plane コクピットの自作に挑戦！</p>



<p>このプロジェクト、X-Plane B777 WoldlinerのオートパイロットーコックピットパネルのArduinoプログラムです。<br>このまま、コピーしてArduinoに貼り込んだら使えます。<br>ただし、TeensyControlsプラグインとArduinoにTeensyduinoをインストールが完了していることが必要です。<br>このプラグラムはまだ完全ではありません。後、問題としてLEDの点灯/消灯が非常に複雑でまだ完璧に動作していません。<br>是非皆さんも勉強のつもりでバグの修正をお願いします。それでよかったら、このプログラムを使っていただきたいとおもいます。</p>



<p class="has-ys-red-color has-text-color has-link-color wp-elements-56485b1aea4bde1f5b18329ba73e0f61">2018年11月14日更新：いいところまでいってますが、完璧ではありません。LEDの点灯に多少問題あり。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ino" data-file="Boing 777 Worldliner Auto Pilot.ino" data-lang="Arduino"><code>
  //B777Wordliner（X-Plane 11）専用。　HDGエンコーダの回転で10と違っているところがある
  //2018年9月10日作成スタート
  //teensy++2.0 用
  
  #include &lt;Encoder.h&gt;
  #include &lt;Bounce.h&gt;
  #include &lt;LedControl.h&gt;
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////// 74HC595（LED表示）シフトレジスタ 共通スクリプト ///////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  int SER_dataPin = 43;   //pin 14（DS-data） on the 75HC595
  int RCLK_latchPin = 44;  //pin 12（ST_CP-latch） on the 75HC595
  int SRCLK_clockPin = 45; //pin 11（SH_CP-clock） on the 75HC595
  #define number_of_74hc595s 3    //シフトレジスタ74HC595の数
  #define numOfRegisterPins number_of_74hc595s * 8    //ここは変更しないこと
  boolean registers[numOfRegisterPins];  //上のレジスタの数を反映させる共通スクリプト
  
  void clearRegisters(){
    for(int i = numOfRegisterPins - 1; i &gt;=  0; i--){
       registers[i] = LOW;  //最初にLEDを全消灯するため（LOWは全点灯）、
                           //確認の為にスタート時にLEDをON,完全にX-Planeが起動したらOFFになる。
    }
  }
  void writeRegisters(){
    digitalWrite(RCLK_latchPin, LOW);
    for(int i = numOfRegisterPins - 1; i &gt;=  0; i--){
      digitalWrite(SRCLK_clockPin, LOW);
      int val = registers[i];
      digitalWrite(SER_dataPin, val);
      digitalWrite(SRCLK_clockPin, HIGH);
    }
    digitalWrite(RCLK_latchPin, HIGH);
  }
  // 個々のピンをHIGかLOWに設定する
  void setRegisterPin(int index, int value){  //indexでピン位置、valueでLOWかHIGH
    registers[index] = value;
  }
  // 共通ここまで ///////////////////////////////
  
  elapsedMillis inactivityTimeout;// 無活動タイムアウト
  
  
  /////////////////////////////////////////////////////////////////////////
  /////////// スイッチ Teensy 直結ピン ///////////
  /////////////////////////////////////////////////////////////////////////
  //####### 左パネル Part-A ##########
  //===============================================================================================
  /////////// Part-A F/D トグルスイッチ //////////////////
  //===============================================================================================
  const int FDSwPin = 0;
  Bounce FDir_toggle_switch = Bounce(FDSwPin, 5);    //teensy 0ピンを使用
  FlightSimInteger FlightDirector;
  //===============================================================================================
  /////////// Part-A A/T ARM トグルスイッチ //////////////////
  //===============================================================================================
  const int ATarmSwPin = 1;
  Bounce ATarmSwitch = Bounce(ATarmSwPin, 5);
  FlightSimInteger AutoThrottleARM;
  //===============================================================================================
  /////////// Part-A A/P プッシュスイッチ //////////////////
  //===============================================================================================
  const int APSwPin = 2;
  Bounce APSwitch = Bounce(APSwPin, 5);
  FlightSimInteger AutoPilotSW;
  //===============================================================================================
  /////////// Part-A CLB CON プッシュスイッチ /////////////////
  //===============================================================================================
  const int CLBCON_SwPin = 3;
  int CLBCON_SwPin_val = 0;       //入力ピンの状態がこの変数(val)に記憶される
  int CLBCON_SwPin_old_val = 0;   //valの前の値を保存しておく変数
  int CLBCON_SwPin_state = 0;     //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger CLBCON_SW;
  //===============================================================================================
  /////////// Part-A A/T プッシュスイッチ //////////////////
  //===============================================================================================
  const int AT_SwPin = 4;
  int AT_SwPin_val = 0; 
  int AT_SwPin_old_val = 0; 
  int AT_SwPin_state = 0;
  FlightSimInteger AT_SW;
  //===============================================================================================
  /////////// Part-A LNAV プッシュスイッチ //////////////////
  //===============================================================================================
  const int LNAV_SwPin = 5;
  int LNAV_SwPin_val = 0;
  int LNAV_SwPin_old_val = 0;
  int LNAV_SwPin_state = 0;
  FlightSimInteger LNAV_SW;
  //===============================================================================================
  /////////// Part-A VNAV プッシュスイッチ //////////////////
  //===============================================================================================
  const int VNAV_SwPin = 6;
  int VNAV_SwPin_val = 0;
  int VNAV_SwPin_old_val = 0; 
  int VNAV_SwPin_state = 0;
  FlightSimInteger VNAV_SW;
  //===============================================================================================
  /////////// Part-A FLCH プッシュスイッチ //////////////////
  //===============================================================================================
  const int FLCH_SwPin = 7;
  int FLCH_SwPin_val = 0;       //入力ピンの状態がこの変数(val)に記憶される 
  int FLCH_SwPin_old_val = 0;   //valの前の値を保存しておく変数 
  int FLCH_SwPin_state = 0;     //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger FLCH_SW;
  //===============================================================================================
  /////////// Part-A IAS MACH チェンジ プッシュスイッチ //////////////////
  //===============================================================================================
  const int IAS_MACHchenge_SwPin = 8;
  int IAS_MACHchenge_SwPin_val = 0; 
  int IAS_MACHchenge_SwPin_old_val = 0; 
  int IAS_MACHchenge_SwPin_state = 0; 
  FlightSimInteger IAS_MACH_airspeed;
  FlightSimInteger IAS_MACHchenge_SW;
  //===============================================================================================
  /////////// Part-A AirSeed エンコーダ //////////////////
  //===============================================================================================
  const int AirSpEncR_pin = 9;      //エンコーダ teensy9ピンを使用
  const int AirSpEncL_Pin = 10;     //エンコーダ teensy10ピンを使用
  Encoder AirSpEnc(AirSpEncR_pin, AirSpEncL_Pin);  
  short AirSpEncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger AirSpeed;        
  FlightSimInteger AirSpeedknob;    //AirSpeedのノブを回転させるためだけの専用
  //===============================================================================================
  /////////// Part-A AirSeed エンコーダ プッシュスイッチ //////////////////
  //===============================================================================================
  const int AirSpeed_EncPush_SwPin = 11;
  int AirSpeed_EncPush_SwPin_val = 0; 
  int AirSpeed_EncPush_SwPin_old_val = 0; 
  int AirSpeed_EncPush_SwPin_state = 0; 
  FlightSimInteger AirSpeed_EncPush_SW;
  
  //####### 中央パネル Part-B ##########
  //===============================================================================================
  /////////// Part-B TOGA タクトスイッチ //////////////////
  //===============================================================================================
  const int TOGA_SwPin = 12;
  int Toga_SwPin_val = 0;           //入力ピンの状態がこの変数(val)に記憶される 
  int Toga_SwPin_old_val = 0;       //valの前の値を保存しておく変数 
  int Toga_SwPin_state = 0;         //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger TOGA_SW;
  //===============================================================================================
  /////////// Part-B DISC タクトスイッチ //////////////////
  //===============================================================================================
  const int DISK_SwPin = 13;
  int DISK_SwPin_val = 0;
  int DISK_SwPin_old_val = 0;
  int DISK_SwPin_state = 0;
  FlightSimInteger DISK_SW;
  //===============================================================================================
  /////////// Part-B HDG HOLD タクトスイッチ //////////////////
  //===============================================================================================
  const int HDG_HOLD_SwPin = 14;
  int HDG_HOLD_SwPin_val = 0; 
  int HDG_HOLD_SwPin_old_val = 0; 
  int HDG_HOLD_SwPin_state = 0;
  FlightSimInteger HDG_HOLD_SW;
  //===============================================================================================
  /////////// Part-B 不明 タクトスイッチ //////////////////
  //===============================================================================================
  //このスイッチ何に使うのかまったく不明。でも一応動作している。
  const int Unknown_SwPin = 15;
  int Unknown_SwPin_val = 0;
  int Unknown_SwPin_old_val = 0;
  int Unknown_SwPin_state = 0;
  FlightSimInteger Unknown_SW;
  //===============================================================================================
  /////////// Part-B HDG TRK 切り替えスイッチ //////////////////
  //===============================================================================================
  const int HDG_TRKchange_SwPin = 16;
  int HDG_TRKchange_SwPin_val = 0;         //入力ピンの状態がこの変数(val)に記憶される 
  int HDG_TRKchange_SwPin_old_val = 0;     //valの前の値を保存しておく変数 
  int HDG_TRKchange_SwPin_state = 0;       //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger HDG_TRKchange_SW;
  //===============================================================================================
  /////////// Part-B HDG BANK LIMIT 6モード切り替え スイッチ //////////////////
  //===============================================================================================
  int BankLimit_SwPin = 17;
  Bounce BankLimit_modeSwitchPin = Bounce (BankLimit_SwPin, 5);
  FlightSimInteger BankLimit_Cange;
  int prev;
 
  // モードの設定
  enum Modes {
    BankLimit_0_Mode, 
    BankLimit_1_Mode,
    BankLimit_2_Mode,
    BankLimit_3_Mode,
    BankLimit_4_Mode,
    BankLimit_5_Mode, 
    Mode_Count         //これで自動的に6つのモードを持つことになる
  };
  int mode = 0; 
  //===============================================================================================
  /////////// Part-B HDG ENC エンコーダ //////////////////
  //===============================================================================================
  const int HdgEncR_rotationPin = 18;       //エンコーダ teensy18ピンを使用
  const int HdgEncEncL_rotationPin = 19;    //エンコーダ teensy19ピンを使用
  Encoder HdgEnc(HdgEncR_rotationPin,HdgEncEncL_rotationPin);  //X-Plane10は回転が逆になっているので左右を入れ替える
  short HdgEncPrev = 0;
  FlightSimInteger headingBug;
  FlightSimInteger headingBugKnob;
  //===============================================================================================
  /////////// Part-B HDG エンコーダ プッシュスイッチ //////////////////
  //===============================================================================================
  const int HDG_EncPush_SwPin = 20;
  int HDG_EncPush_SwPin_val = 0;       //入力ピンの状態がこの変数(val)に記憶される 
  int HDG_EncPush_SwPin_old_val = 0;   //valの前の値を保存しておく変数 
  int HDG_EncPush_SwPin_state = 0;     //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger HDG_EncPush_SW;
  
  //####### 右パネル Part-C ##########
  //===============================================================================================
  /////////// Part-C V/S FPA タクトスイッチ //////////////////
  //===============================================================================================
  const int VS_FPA_SwPin = 21;
  int VS_FPA_SwPin_val = 0;
  int VS_FPA_SwPin_old_val = 0;
  int VS_FPA_SwPin_state = 0; 
  FlightSimInteger VS_FPA_SW;
  //===============================================================================================
  /////////// Part-C ALT HOLD タクトスイッチ //////////////////
  //===============================================================================================
  const int ALT_HOLD_SwPin = 22;
  int ALT_HOLD_SwPin_val = 0; 
  int ALT_HOLD_SwPin_old_val = 0; 
  int ALT_HOLD_SwPin_state = 0; 
  FlightSimInteger ALT_HOLD_SW;
  //===============================================================================================
  /////////// Part-C APP タクトスイッチ //////////////////
  //===============================================================================================
  const int APP_SwPin = 23;
  int APP_SwPin_val = 0;
  int APP_SwPin_old_val = 0;
  int APP_SwPin_state = 0;
  FlightSimInteger APP_SW;
  //===============================================================================================
  /////////// Part-C LOC タクトスイッチ //////////////////
  //===============================================================================================
  const int LOC_SwPin = 24;
  int LOC_SwPin_val = 0;
  int LOC_SwPin_old_val = 0;
  int LOC_SwPin_state = 0;
  FlightSimInteger LOC_SW;
  //===============================================================================================
  /////////// Part-C V/S FPA 切り替えスイッチ //////////////////
  //===============================================================================================
  const int VS_FRA_change_SwPin = 25;
  int VS_FRA_change_SwPin_val = 0; //入力ピンの状態がこの変数(val)に記憶される 
  int VS_FRA_change_SwPin_old_val = 0; //valの前の値を保存しておく変数 
  int VS_FRA_change_SwPin_state = 0; //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger VS_FRA_change_SW;
  //===============================================================================================
  /////////// Part-C AUTO 1000 セレクトスイッチ //////////////////)
  //===============================================================================================
  const int AUTO_1000_changeSwPin = 26;
  int AUTO_1000_changeSwPin_val = 0; 
  int AUTO_1000_changeSwPin_old_val = 0; 
  int AUTO_1000_changeSwPin_state = 0; 
  FlightSimInteger AUTO_1000_changeSW;
  //===============================================================================================
  /////////// Part-C Teensyの電圧がONになっているかを確認 //////////////////
  //===============================================================================================
  const int Teensy_Pawer_ON_LED_Pin = 27;
  
  //===============================================================================================
  /////////// Part-C V/S ENC エンコーダ //////////////////
  //===============================================================================================
  const int VSpEncR_rotationPin = 28;    //エンコーダ teensy28ピンを使用
  const int VSpEncL_rotationPin = 29;    //エンコーダ teensy29ピンを使用
  Encoder VSpEnc = Encoder(VSpEncR_rotationPin, VSpEncL_rotationPin);   
  short VSpEncPrev = 0xaa;               //0xaaで下２桁の数字を0にする。エンコーダの逆回転
  FlightSimInteger VerticalSpeed;        //バーチカルスピード数値を取得するために使用
  FlightSimInteger VSpeedKnob;           //エンコーダのノブを回すためだけに使用
  //===============================================================================================
  /////////// Part-C ALT ENC エンコーダ //////////////////
  //===============================================================================================
  const int AltEncR_rotationPin = 30;    //エンコーダ teensy28ピンを使用
  const int AltEncL_rotationPin = 31;    //エンコーダ teensy28ピンを使用
  Encoder AltEnc = Encoder(AltEncR_rotationPin, AltEncL_rotationPin);    
  short AltEncPrev = 0xaa;               //0xaaで下２桁の数字を0にする。エンコーダの逆回転
  FlightSimInteger Altitude;             //高度数値を取得するために使用
  FlightSimInteger AltKnob;              //エンコーダのノブを回すためだけに使用
  //===============================================================================================
  /////////// Part-C ALTTUDE エンコーダ プッシュスイッチ //////////////////
  //===============================================================================================
  const int ALT_EncPush_SwPin = 32;
  int ALT_EncPush_SwPin_val = 0;         //入力ピンの状態がこの変数(val)に記憶される 
  int ALT_EncPush_SwPin_old_val = 0;     //valの前の値を保存しておく変数 
  int ALT_EncPush_SwPin_state = 0;       //LEDの状態(0ならオフ、1ならオン) 
  FlightSimInteger ALT_EncPush_SW;
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////// LED表示（74HC595）シフトレジスタ経由 ///////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //複雑な動きをするLEDの点灯/消灯のためにこの宣言を特別に別枠で作成している。
  FlightSimInteger Ap_Mode;
  FlightSimInteger At_mode;
  FlightSimInteger Fd_Visible;
  FlightSimInteger Pitch_Mode_Armed;
  FlightSimInteger Pitch_Mode_Engaged;
  FlightSimInteger Roll_Mode_Armed;
  FlightSimInteger Roll_Mode_Engaged;
  FlightSimInteger Warn_Flags;
  //####### 左パネル Part-A ##########
  //==============================================================================================
  /////////// Part-A LED表示（74HC595）シフトレジスタ A/P ランプ//////////////////
  //==============================================================================================
  const int AP_74HC595_Pin = 0;
  FlightSimInteger AutoPilotSwLED;               //1番パネLED
  //==============================================================================================
  /////////// Part-A LED表示（74HC595）シフトレジスタ A/T ランプ//////////////////
  //==============================================================================================
  const int AT_74HC595_Pin = 1;
  FlightSimInteger AutothrottleEngageSwLED;      //1番パネLED 
  //==============================================================================================
  /////////// Part-A LED表示（74HC595）シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  const int LNAV_74HC595_Pin = 2; 
  FlightSimInteger LateralNavSwLED;
  //==============================================================================================
  /////////// Part-A LED表示（74HC595）シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  const int VNAV_74HC595_Pin = 3;
  FlightSimInteger VerticalNavSwLED;
  //==============================================================================================
  /////////// Part-A LED表示（74HC595）シフトレジスタ FLCH ランプ //////////////////
  //==============================================================================================
  const int FLCH_74HC595_Pin = 4;
  FlightSimInteger FlightLevelChangeSwLED; 
  
  //####### 中央パネル Part-B ##########
  //==============================================================================================
  /////////// Part-B LED表示（74HC595）シフトレジスタ BANK LIMIT 6モード切り替え ランプ //////////////////
  //==============================================================================================
  const int bankAUTO_74HC595_Pin = 5;
  const int bank5_74HC595_Pin = 6;
  const int bank10_74HC595_Pin = 7;
  const int bank15_74HC595_Pin = 8;
  const int bank20_74HC595_Pin = 9;
  const int bank25_74HC595_Pin = 10;
  FlightSimInteger BankLimit_chengeLED;
  //===============================================================================================
  /////////// Part-B LED表示（74HC595）シフトレジスタ TOGA ランプ //////////////////
  //===============================================================================================
  const int Toga_74HC595_Pin = 11;
  FlightSimInteger TogaSwLED;
  
  ///これは実際は点灯しないのでいらないがLEDを付けてしまったので、瞬間点灯を行うようにする。
  //===============================================================================================
  /////////// Part-B LED表示（74HC595）シフトレジスタ DISC ランプ //////////////////
  //===============================================================================================
  const int Disk_74HC595_Pin = 12;
  FlightSimInteger DiskSwLED;
  //===============================================================================================
  /////////// Part-B LED表示（74HC595）シフトレジスタ HDG HOLD ランプ //////////////////
  //===============================================================================================
  const int HDG_HOLD_74HC595_Pin = 13;
  FlightSimInteger HeadingTrackHoldSwLED;
  
  //####### 右パネル Part-C ##########
  //===============================================================================================
  /////////// Part-C LED表示（74HC595）シフトレジスタ V/S FPA らんぷ //////////////////
  //===============================================================================================
  const int VS_FPA_74HC595_Pin = 14;
  FlightSimInteger VsFpaReferenceSwLED;
  //==============================================================================================
  /////////// Part-C LED表示（74HC595）シフトレジスタ ALT HOLD ランプ //////////////////
  //==============================================================================================
  const int ALT_HOLD_74HC595_Pin = 15;
  FlightSimInteger AltitudeHoldSwLED; 
  //==============================================================================================
  /////////// Part-C LED表示（74HC595）シフトレジスタ LOC ランプ //////////////////
  //==============================================================================================
  const int LOC_74HC595_Pin = 16;
  FlightSimInteger LocalizerSwLED; 
  //==============================================================================================
  /////////// Part-C LED表示（74HC595）シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  const int APP_74HC595_Pin = 17;
  FlightSimInteger ApproachSwLED;
  //==============================================================================================
  /////////// Part-C LED表示（74HC595）シフトレジスタ AUTO/1000チェンジ ランプ //////////////////
  //==============================================================================================
  const int upAUTO_74HC595_Pin = 18;
  const int up1000_74HC595_Pin = 19;
  FlightSimInteger AUTO_1000_chengeLED;
  
void setup() {
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  // setup内 シフトレジスタ  共通スクリプト //
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  pinMode(SER_dataPin, OUTPUT);
  pinMode(RCLK_latchPin, OUTPUT);
  pinMode(SRCLK_clockPin, OUTPUT);
  clearRegisters();  //すべてのレジスタピンをリセット
  writeRegisters();
  // 共通スクリプト ここまで ////////////////////////////////////////////////////////////////////////////////
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////// setup内 スイッチ Teensy 直結ピン //////////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  //####### 左パネル Part-A ##########
  //===============================================================================================
  /////////// setup内 Part-A F/D トグルスイッチ //////////////////
  //===============================================================================================
  pinMode(FDSwPin, INPUT_PULLUP);
  FlightDirector = XPlaneRef(&quot;anim/34/switch&quot;);
  //===============================================================================================
  /////////// setup内 Part-A A/T ARM トグルスイッチ //////////////////
  //===============================================================================================
  pinMode(ATarmSwPin, INPUT_PULLUP);                  
  AutoThrottleARM = XPlaneRef(&quot;anim/33/switch&quot;); 
  //===============================================================================================
  /////////// setup内 Part-A A/P タクトスイッチ //////////////////
  //===============================================================================================
  pinMode(APSwPin, INPUT_PULLUP);
  AutoPilotSW = XPlaneRef(&quot;anim/13/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A CLB CON タクトスイッチ //////////////////
  //===============================================================================================
  pinMode(CLBCON_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  CLBCON_SW = XPlaneRef(&quot;anim/14/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A A/T タクトスイッチ //////////////////
  //===============================================================================================    
  pinMode(AT_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  AT_SW = XPlaneRef(&quot;anim/15/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A IAS MACH 切り替えスイッチ ////////////////// 
  //===============================================================================================
  pinMode(IAS_MACHchenge_SwPin, INPUT_PULLUP);
  IAS_MACHchenge_SW = XPlaneRef(&quot;anim/19/button&quot;);
  //初期設定
  IAS_MACHchenge_SW = 1;
  //===============================================================================================
  /////////// setup内 Part-A エアースピード エンコーダ  //////////////////
  //===============================================================================================
  pinMode(AirSpEncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(AirSpEncL_Pin, INPUT_PULLUP);  //エンコーダ
    AirSpeed = XPlaneRef(&quot;T7Avionics/ap/spd_act&quot;);  //encoder
    AirSpeedknob = XPlaneRef(&quot;anim/1/spacial&quot;);  //ノブを回転させるだけのために
  //===============================================================================================
  /////////// setup内 Part-A エアースピード エンコーダ プッシュスイッチ  //////////////////
  //===============================================================================================
  pinMode(AirSpeed_EncPush_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  AirSpeed_EncPush_SW = XPlaneRef(&quot;anim/186/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A LNAV タクトスイッチ  //////////////////
  //============================================================================================
  pinMode(LNAV_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  LNAV_SW = XPlaneRef(&quot;anim/16/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A VNAV タクトスイッチ  //////////////////
  //============================================================================================
  pinMode(VNAV_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  VNAV_SW = XPlaneRef(&quot;anim/17/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-A FLCH タクトスイッチ  //////////////////
  //============================================================================================
  pinMode(FLCH_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  FLCH_SW = XPlaneRef(&quot;anim/18/button&quot;);
  
  //####### 中央パネル Part-B ########## 
  //===============================================================================================
  /////////// setup内 Part-B TOGA タクトスイッチ //////////////////コマンドを使用
  //===============================================================================================
  pinMode(TOGA_SwPin, INPUT_PULLUP);
  TOGA_SW = XPlaneRef(&quot;anim/149/button&quot;);               //下段左
  //===============================================================================================
  /////////// setup内 Part-B DISC タクトスイッチ //////////////////コマンドを使用
  //===============================================================================================
  pinMode(DISK_SwPin, INPUT_PULLUP);
  DISK_SW = XPlaneRef(&quot;anim/176/button&quot;);         //違ったらこれ 777/at_disc
  //===============================================================================================
  /////////// setup内 Part-B 謎のタクトスイッチ //////////////////コマンドを使用
  //===============================================================================================
  pinMode(Unknown_SwPin, INPUT_PULLUP);
  Unknown_SW = XPlaneRef(&quot;anim/20/button&quot;);         //違ったらこれ 777/at_disc
  //===============================================================================================
  /////////// setup内 Part-B HDG TRK 切り替えスイッチ //////////////////
  //===============================================================================================
  pinMode(HDG_TRKchange_SwPin, INPUT_PULLUP); 
  HDG_TRKchange_SW = XPlaneRef(&quot;anim/21/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-B HDG エンコーダ  //////////////////
  //=============================================================================================== 
  pinMode(HdgEncR_rotationPin, INPUT_PULLUP);  //エンコーダ
  pinMode(HdgEncEncL_rotationPin, INPUT_PULLUP);  //エンコーダ
  headingBug = XPlaneRef(&quot;T7Avionics/ap/hdg_act&quot;);  //エンコーダ
  headingBugKnob = XPlaneRef(&quot;anim/2/spacial&quot;);  //ノブを回転させるだけのために
  //===============================================================================================
  /////////// setup内 Part-B HDG エンコーダ プッシュスイッチ  //////////////////
  //=============================================================================================
  pinMode(HDG_EncPush_SwPin, INPUT_PULLUP); 
  HDG_EncPush_SW = XPlaneRef(&quot;anim/173/button&quot;);  //スタート時は0が本当
  HDG_EncPush_SW = 0;  //何故かこれが1になってしまうので強制的にスタートは0にする。
  //===============================================================================================
  /////////// setup内 Part-B HDG BANK LIMIT 切り替えスイッチ //////////////////
  //===============================================================================================
  pinMode(BankLimit_SwPin, INPUT_PULLUP);
  BankLimit_Cange = XPlaneRef(&quot;anim/68/switch&quot;);
  //===============================================================================================
  /////////// setup内 Part-B HDG HOLD タクトスイッチ //////////////////
  //===============================================================================================
  pinMode(HDG_HOLD_SwPin, INPUT_PULLUP); 
  HDG_HOLD_SW = XPlaneRef(&quot;anim/22/button&quot;);
  
  //####### 右パネル Part-C ##########
  //===============================================================================================
  /////////// setup内 Part-C V/S FPA 切り替えスイッチ //////////////////
  //===============================================================================================
  pinMode(VS_FRA_change_SwPin, INPUT_PULLUP); 
  VS_FRA_change_SW = XPlaneRef(&quot;anim/23/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-C V/S エンコーダ //////////////////
  //===============================================================================================
  pinMode(VSpEncR_rotationPin, INPUT_PULLUP);    //右回転エンコーダ
  pinMode(VSpEncL_rotationPin, INPUT_PULLUP);    //左回転エンコーダ
  VerticalSpeed = XPlaneRef(&quot;T7Avionics/ap/vs_act&quot;);    //encoder
  VSpeedKnob = XPlaneRef(&quot;anim/3/spacial&quot;);  //ノブを回転させるだけのために
  //===============================================================================================
  /////////// setup内 Part-C V/S FPA タクトスイッチ //////////////////
  //===============================================================================================
  pinMode(VS_FPA_SwPin, INPUT_PULLUP); 
  VS_FPA_SW = XPlaneRef(&quot;anim/24/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-C AUTOと1000の切り替えスイッチ //////////////////
  //==============================================================================================
  pinMode(AUTO_1000_changeSwPin, INPUT_PULLUP); 
  AUTO_1000_changeSW = XPlaneRef(&quot;anim/69/switch&quot;);
  //===============================================================================================
  /////////// setup内 Part-C ALTTUDE エンコーダ //////////////////
  //===============================================================================================
  pinMode(AltEncR_rotationPin, INPUT_PULLUP);    //右回転エンコーダ
  pinMode(AltEncL_rotationPin, INPUT_PULLUP);    //左回転エンコーダ
  Altitude = XPlaneRef(&quot;T7Avionics/ap/alt_act&quot;);    //encoder
  AltKnob = XPlaneRef(&quot;anim/4/spacial&quot;);  //ノブを回転させるだけのために
  //===============================================================================================
  /////////// setup内 Part-C ALTTUDE エンコーダ プッシュ（タクト）スイッチ //////////////////
  //==============================================================================================
  pinMode(ALT_EncPush_SwPin, INPUT_PULLUP); 
  ALT_EncPush_SW = XPlaneRef(&quot;anim/184/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-C ALT HOLD タクトスイッチ //////////////////
  //==============================================================================================
  pinMode(ALT_HOLD_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  ALT_HOLD_SW = XPlaneRef(&quot;anim/25/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-C LOC タクトスイッチ //////////////////
  //==============================================================================================
  pinMode(LOC_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  LOC_SW = XPlaneRef(&quot;anim/26/button&quot;);
  //===============================================================================================
  /////////// setup内 Part-C APP タクトスイッチ //////////////////
  //==============================================================================================
  pinMode(APP_SwPin, INPUT_PULLUP); //BUTTONは入力に設定 
  APP_SW = XPlaneRef(&quot;anim/27/button&quot;);
  /*
  //===============================================================================================
  /////////// setup内 Part-C Teensyの電圧がONになっているかを確認 //////////////////
  //===============================================================================================
  //Teensyが動作しているのを確認。スタート時、3回点滅後、パネル本体の初期設定LED(AUTO)2個が点灯する。
  pinMode(Teensy_Pawer_ON_LED_Pin, OUTPUT);
  for(int i=0; i&lt;3; i=i+1) {
	   digitalWrite(Teensy_Pawer_ON_LED_Pin, HIGH);
	   delay(1000);
	   digitalWrite(Teensy_Pawer_ON_LED_Pin, LOW);
	   delay(1000);
	}
  */
  
  
  
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  // setup内 Part-A LEDピン 74HC595 シフトレジスタ 経由 /////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //複雑な動きをするLEDの点灯/消灯のためにこのdatarefを特別に別枠で作成している。
  // ①AutoPilotSwLED = T7Avionics/ap/ap_mode
  // ②AutothrottleEngageSwLED = T7Avionics/ap/at_mode
  // ③Fd_Visible = T7Avionics/ap/fd_visible
  // ④ApproachSwLED = T7Avionics/ap/pitch_mode_armed
  // ⑤AltitudeHoldSwLED = T7Avionics/ap/pitch_mode_engaged
  // ⑥LocalizerSwLED = T7Avionics/ap/roll_mode_armed
  // ⑦HeadingTrackHoldSwLED = T7Avionics/ap/roll_mode_engaged
  // ⑧Warn_Flags = T7Avionics/ap/warn_flags
  
  Ap_Mode = XPlaneRef(&quot;T7Avionics/ap/ap_mode&quot;);
  At_mode = XPlaneRef(&quot;T7Avionics/ap/at_mode&quot;);
  Fd_Visible = XPlaneRef(&quot;T7Avionics/ap/fd_visible&quot;);
  Pitch_Mode_Armed = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_armed&quot;);
  Pitch_Mode_Engaged = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);
  Roll_Mode_Armed = XPlaneRef(&quot;T7Avionics/ap/roll_mode_armed&quot;);
  Roll_Mode_Engaged = XPlaneRef(&quot;T7Avionics/ap/roll_mode_engaged&quot;);
  Warn_Flags = XPlaneRef(&quot;T7Avionics/ap/warn_flags&quot;);
  
  //####### 左パネル Part-A ##########
  //===============================================================================================
  /////////// setup内 Part-A 74HC595（LED表示）シフトレジスタ A/P ランプ //////////////////
  //===============================================================================================
   AutoPilotSwLED = XPlaneRef(&quot;T7Avionics/ap/ap_mode&quot;);
    AutoPilotSwLED.onChange(updateAutoPilotSwLED);
  //===============================================================================================
  /////////// setup内 Part-A 74HC595（LED表示）シフトレジスタ A/T ランプ //////////////////
  //===============================================================================================
   AutothrottleEngageSwLED = XPlaneRef(&quot;T7Avionics/ap/at_mode&quot;);
   // AutothrottleEngageSwLED.onChange(updateAutothrottleEngageSwLED);
    //===============================================================================================
  /////////// setup内 Part-A 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////旧T7Avionics/ap/roll_mode_engaged
  //===============================================================================================
  LateralNavSwLED = XPlaneRef(&quot;T7Avionics/ap/roll_mode_engaged&quot;);
  // LateralNavSwLED.onChange(updateLateralNavSwLED);
   //===============================================================================================
  /////////// setup内 Part-A 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //===============================================================================================
  VerticalNavSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);
  // VerticalNavSwLED.onChange(updateVerticalNavSwLED);
  //===============================================================================================
  /////////// setup内 Part-A 74HC595（LED表示）シフトレジスタ FLCH ランプ //////////////////
  //===============================================================================================
  FlightLevelChangeSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);
  // FlightLevelChangeSwLED.onChange(updateFlightLevelChangeSwLED);
  
  //####### 中央パネル Part-B ##########
  //===============================================================================================
  /////////// setup内 Part-B 74HC595（LED表示）シフトレジスタ TOGA ランプ //////////////////
  //===============================================================================================
  //sim/cockpit2/autopilot/TOGA_statusp
  TogaSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);//まだ不明
  // TogaSwLED.onChange(updateTogaSwLED);
  //===============================================================================================
  /////////// setup内 Part-B 74HC595（LED表示）シフトレジスタ DISK ランプ //////////////////
  //===============================================================================================
  //実際はランプはない、作成してしまったので瞬間だけ点灯させる。
  DiskSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);//まだ不明
  // DiskSwLED.onChange(updateDiskSwLED);
   
   //==============================================================================================
  /////////// setup内 Part-B 74HC595（LED表示）シフトレジスタ BANK LIMITチェンジ ランプ //////////////////
  //==============================================================================================
  BankLimit_chengeLED = XPlaneRef(&quot;anim/68/switch&quot;);
    BankLimit_chengeLED.onChange(updateBankLimit_chengeLED);
    
  //LEDの初期設定（X-Planeを起動した時この点灯にする）
  setRegisterPin(bankAUTO_74HC595_Pin, HIGH);
  setRegisterPin(bank5_74HC595_Pin, LOW);
  setRegisterPin(bank10_74HC595_Pin, LOW);
  setRegisterPin(bank15_74HC595_Pin, LOW);
  setRegisterPin(bank20_74HC595_Pin, LOW);
  setRegisterPin(bank25_74HC595_Pin, LOW);
  //==============================================================================================
  /////////// setup内 Part-B 74HC595（LED表示）シフトレジスタ AUTO/1000チェンジ ランプ //////////////////
  //==============================================================================================
  AUTO_1000_chengeLED = XPlaneRef(&quot;anim/69/switch&quot;);
    AUTO_1000_chengeLED.onChange(updateAUTO_1000_chengeLED);
  //LEDの初期設定（X-Planeを起動した時この点灯にする）
  setRegisterPin(upAUTO_74HC595_Pin, HIGH);
  setRegisterPin(up1000_74HC595_Pin, LOW);
  //===============================================================================================
  /////////// setup内 Part-B 74HC595（LED表示）シフトレジスタ HDG HOLD ランプ //////////////////
  //===============================================================================================
  HeadingTrackHoldSwLED = XPlaneRef(&quot;T7Avionics/ap/roll_mode_engaged&quot;);
   // HeadingTrackHoldSwLED.onChange(updateHeadingTrackHoldSwLED);
    
    
  //####### 右パネル Part-C ##########
  //===============================================================================================
  /////////// setup内 Part-C 74HC595（LED表示）シフトレジスタ V/S FPA ランプ //////////////////
  //===============================================================================================
  VsFpaReferenceSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;);
    VsFpaReferenceSwLED.onChange(updateVsFpaReferenceSwLED);
  //===============================================================================================
  /////////// setup内 Part-C 74HC595（LED表示）シフトレジスタ ALT HOLD ランプ //////////////////
  //===============================================================================================
  AltitudeHoldSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_engaged&quot;); 
    AltitudeHoldSwLED.onChange(updateAltitudeHoldSwLED);
  //===============================================================================================
  /////////// setup内 Part-C 74HC595（LED表示）シフトレジスタ LOC ランプ //////////////////
  //===============================================================================================
  LocalizerSwLED = XPlaneRef(&quot;T7Avionics/ap/roll_mode_armed&quot;); 
  // LocalizerSwLED.onChange(updateLocalizerSwLED);
  //===============================================================================================
  /////////// setup内 Part-C 74HC595（LED表示）シフトレジスタ APP ランプ //////////////////
  //===============================================================================================
  ApproachSwLED = XPlaneRef(&quot;T7Avionics/ap/pitch_mode_armed&quot;); 
  //  ApproachSwLED.onChange(updateApproachSwLED);
  //===============================================================================================
  /////////// setup内 Part-C HDG BANK LIMIT 6モード切り替え スイッチ //////////////////
  //===============================================================================================
  pinMode(BankLimit_SwPin, INPUT_PULLUP);   
  BankLimit_Cange = XPlaneRef(&quot;anim/68/switch&quot;);
}
void loop() {
  FlightSim.update();
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  // loop内 74HC595 シフトレジスタ 共通 //
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  writeRegisters();  //変更内容を表示するために呼び出さなければなりません
                     //必要な値が設定された後に一度だけ呼び出します。
  //////// loop内 シフトレジスタ 共通 END ///////////////////////////////////////////////////////////////////
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////// loop内 スイッチ Teensy 直結ピン //////////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  //####### 左パネル Part-A ##########
  //==============================================================================================
  /////////// loop内 Part-A FlightDirector トグルスイッチ //////////////////
  //==============================================================================================
  FDir_toggle_switch.update();
    if (FDir_toggle_switch.fallingEdge()) {
    FlightDirector = 1;        //スイッチ押し下げたときdatarefを&#39;1&#39;にする
    inactivityTimeout = 0;
  }
  if (FDir_toggle_switch.risingEdge()) {
    FlightDirector = 0;        //スイッチ押し下げたときdatarefを&#39;0&#39;にする
  }
  //==============================================================================================
  /////////// loop内 Part-A AutoThrottle ARM トグルスイッチ //////////////////
  //==============================================================================================
  ATarmSwitch.update();
  if (ATarmSwitch.fallingEdge()) {
    AutoThrottleARM = 1;
    inactivityTimeout = 0;
  }
  if (ATarmSwitch.risingEdge()) {
    AutoThrottleARM = 0;
  }
  //==============================================================================================
  /////////// loop内 Part-A AP タクトスイッチ //////////////////
  //==============================================================================================
  APSwitch.update();
  if (APSwitch.fallingEdge()) {
    AutoPilotSW = 2; 
    inactivityTimeout = 0;
  }
  if (APSwitch.risingEdge()) {
    AutoPilotSW = 0;
  }
  //==============================================================================================
  /////////// loop内 Part-A CLB CON タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  //以下はタクトスイッチを押したとき、1度目はONを保持し、2度めでOFFを保持するを繰り返す。
   CLBCON_SwPin_val = digitalRead(CLBCON_SwPin);
  if((CLBCON_SwPin_val == LOW) && (CLBCON_SwPin_old_val == HIGH)) { 
    CLBCON_SwPin_state = 1 - CLBCON_SwPin_state; 
    //delay(10); //チャタリングが起きるいときはこれを有効にする（500位が安定しているかも）
  } 
  CLBCON_SwPin_old_val = CLBCON_SwPin_val; 
  if(CLBCON_SwPin_state ==1){ 
    CLBCON_SW = 1;
  } else { 
    CLBCON_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A A/T タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  AT_SwPin_val = digitalRead(AT_SwPin); 
  if((AT_SwPin_val == LOW) && (AT_SwPin_old_val == HIGH)) { 
    AT_SwPin_state = 1 - AT_SwPin_state; 
    //delay(10); 
  } 
  
  AT_SwPin_old_val = AT_SwPin_val;
  if(AT_SwPin_state ==1){ 
    AT_SW = 1;
  } else { 
    AT_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A Ias Mach 切り替えスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  IAS_MACHchenge_SwPin_val = digitalRead(IAS_MACHchenge_SwPin); 
  
  if((IAS_MACHchenge_SwPin_val == LOW) && (IAS_MACHchenge_SwPin_old_val == HIGH)) {
    IAS_MACHchenge_SwPin_state = 1 - IAS_MACHchenge_SwPin_state;  
  } 
 
  IAS_MACHchenge_SwPin_old_val = IAS_MACHchenge_SwPin_val; 
  
  if(IAS_MACHchenge_SwPin_state ==1){ 
    IAS_MACHchenge_SW = 1;
  } 
  else { 
    IAS_MACHchenge_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A AirSpeed エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short AirSpEncDiff = (AirSpEnc.read() - AirSpEncPrev) / 4;
  
  if (AirSpEncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    AirSpEncPrev = 0;
    AirSpEnc.write(0);
  
    // datarefを一時的な値にコピー
    float airSp = AirSpeed;
    float airSpkn = AirSpeedknob;
  
    // 一時的な値に変更を適用
    airSp += AirSpEncDiff;
    airSpkn += AirSpEncDiff;
  
    // 範囲チェックを行う
    while (airSp &lt; 100) airSp += 1;  //エアスピードが 100 より小さい場合は 1 をプラスする（つまり100で止まる）
    while (airSp &gt;= 400) airSp -= 1;  //エアスピードが 400 より大きい場合は 1 をマイナスする（つまり399で止まる）
  
    // datarefへ検証された新しいエアースピードの数値を書く
    AirSpeed = airSp;
    AirSpeedknob = airSpkn;
  }
  //==============================================================================================
  /////////// loop内 Part-A AirSpeed エンコーダ プッシュスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  AirSpeed_EncPush_SwPin_val = digitalRead(AirSpeed_EncPush_SwPin); 
  if((AirSpeed_EncPush_SwPin_val == LOW) && (AirSpeed_EncPush_SwPin_old_val == HIGH)) { 
    AirSpeed_EncPush_SwPin_state = 1 - AirSpeed_EncPush_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  AirSpeed_EncPush_SwPin_old_val = AirSpeed_EncPush_SwPin_val; //valはもう古くなったので保持しておく 
  if(AirSpeed_EncPush_SwPin_state ==1){ 
    AirSpeed_EncPush_SW = 1;
  } else { 
    AirSpeed_EncPush_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A LNAV タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  LNAV_SwPin_val = digitalRead(LNAV_SwPin); 
  if((LNAV_SwPin_val == LOW) && (LNAV_SwPin_old_val == HIGH)) { 
    LNAV_SwPin_state = 1 - LNAV_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  LNAV_SwPin_old_val = LNAV_SwPin_val; 
  if(LNAV_SwPin_state ==1){ 
    LNAV_SW = 1;
  } else { 
    LNAV_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A VNAV タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  VNAV_SwPin_val = digitalRead(VNAV_SwPin); 
  if((VNAV_SwPin_val == LOW) && (VNAV_SwPin_old_val == HIGH)) { 
    VNAV_SwPin_state = 1 - VNAV_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  VNAV_SwPin_old_val = VNAV_SwPin_val;  
  if(VNAV_SwPin_state ==1){ 
    VNAV_SW = 1;
  } 
  else { 
    VNAV_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A FLCH タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  FLCH_SwPin_val = digitalRead(FLCH_SwPin); //ボタンの入力（HIGHかLOW）を読み取りvalに格納
                                        //入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((FLCH_SwPin_val == LOW) && (FLCH_SwPin_old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    FLCH_SwPin_state = 1 - FLCH_SwPin_state;  //stateは1からstateを引いた値（つまり、stateが1なら0、0なら1となる）
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
 
  FLCH_SwPin_old_val = FLCH_SwPin_val; //valはもう古くなったので保持しておく 
  if(FLCH_SwPin_state ==1){ 
    FLCH_SW = 1;
  } 
  else { 
    FLCH_SW = 0;
  } 
  
  //####### 中央パネル Part-B ##########
  //==============================================================================================
  /////////// loop内 Part-B TOGA タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  Toga_SwPin_val = digitalRead(TOGA_SwPin); //ボタンの入力（HIGHかLOW）を読み取りvalに格納
                                        //入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((Toga_SwPin_val == LOW) && (Toga_SwPin_old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    Toga_SwPin_state = 1 - Toga_SwPin_state;  //stateは1からstateを引いた値（つまり、stateが1なら0、0なら1となる）
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
 
  Toga_SwPin_old_val = Toga_SwPin_val; //valはもう古くなったので保持しておく 
  if(Toga_SwPin_state ==1){ 
    TOGA_SW = 1;
  } 
  else { 
    TOGA_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-B DISC タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  DISK_SwPin_val = digitalRead(DISK_SwPin); //ボタンの入力（HIGHかLOW）を読み取りvalに格納
                                        //入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((DISK_SwPin_val == LOW) && (DISK_SwPin_old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    DISK_SwPin_state = 1 - DISK_SwPin_state;  //stateは1からstateを引いた値（つまり、stateが1なら0、0なら1となる）
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
 
  DISK_SwPin_old_val = DISK_SwPin_val; //valはもう古くなったので保持しておく 
  if(DISK_SwPin_state ==1){ 
    DISK_SW = 1;
  } 
  else { 
    DISK_SW = 0;
  } 
  
  //==============================================================================================
  /////////// loop内 Part-B 謎の タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  Unknown_SwPin_val = digitalRead(Unknown_SwPin); 
  if((Unknown_SwPin_val == LOW) && (Unknown_SwPin_old_val == HIGH)) { 
    Unknown_SwPin_state = 1 - Unknown_SwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  Unknown_SwPin_old_val = Unknown_SwPin_val; //valはもう古くなったので保持しておく 
  if(Unknown_SwPin_state ==1){ 
    Unknown_SW = 1;
  } 
  else { 
    Unknown_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-B HDG TRK 切り替えスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  HDG_TRKchange_SwPin_val = digitalRead(HDG_TRKchange_SwPin); 
  if((HDG_TRKchange_SwPin_val == LOW) && (HDG_TRKchange_SwPin_old_val == HIGH)) { 
    HDG_TRKchange_SwPin_state = 1 - HDG_TRKchange_SwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  HDG_TRKchange_SwPin_old_val = HDG_TRKchange_SwPin_val; //valはもう古くなったので保持しておく 
  if(HDG_TRKchange_SwPin_state ==1){ 
    HDG_TRKchange_SW = 1;
  } 
  else { 
    HDG_TRKchange_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-B HDG エンコーダ //////////////////
  //==============================================================================================
  short HdgEncDiff = (HdgEnc.read() - HdgEncPrev) / 4;
  
  if (HdgEncDiff) {
    // only update prev when we&#39;ve reached a detent!
    HdgEncPrev = 0;
    HdgEnc.write(0);
  
    // copy dataref to temporary value
    float hdg = headingBug;
  
    // apply changes to temp value
    hdg += HdgEncDiff;
  
    // do range checking
    while (hdg &lt; 0.0) hdg += 360.0;
    while (hdg &gt;= 360.0) hdg -= 360.0;
  
    // 検証されてものを書き込む
    headingBug = hdg;
    headingBugKnob = hdg;
  }
  //==============================================================================================
  /////////// loop内 Part-B HDG エンコーダ プッシュスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  //下のHIGHとLOWで最初の数値が0か1かを設定できる。最初のスタート時は0にならなければならない。
  HDG_EncPush_SwPin_val = digitalRead(HDG_EncPush_SwPin); //ボタンの入力（HIGHかLOW）を読み取りvalに格納
                                        //入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((HDG_EncPush_SwPin_val == LOW) && (HDG_EncPush_SwPin_old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    HDG_EncPush_SwPin_state = 1 - HDG_EncPush_SwPin_state;  //stateは1からstateを引いた値（つまり、stateが1なら0、0なら1となる）
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
 
  HDG_EncPush_SwPin_old_val = HDG_EncPush_SwPin_val; //valはもう古くなったので保持しておく 
  if(HDG_EncPush_SwPin_state ==1){ 
    HDG_EncPush_SW = 1;
  } 
  else { 
    HDG_EncPush_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-B HDG HOLD タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  HDG_HOLD_SwPin_val = digitalRead(HDG_HOLD_SwPin); 
  if((HDG_HOLD_SwPin_val == LOW) && (HDG_HOLD_SwPin_old_val == HIGH)) {
    HDG_HOLD_SwPin_state = 1 - HDG_HOLD_SwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  HDG_HOLD_SwPin_old_val = HDG_HOLD_SwPin_val;  
  if(HDG_HOLD_SwPin_state ==1){ 
    HDG_HOLD_SW = 1;
  } 
  else { 
    HDG_HOLD_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-B BANK LIMIT 6モード切り替え スイッチ //////////////////
  //==============================================================================================
  prev = BankLimit_Cange;
  
  FlightSim.update();
  BankLimit_modeSwitchPin.update();
   
  if(BankLimit_modeSwitchPin.fallingEdge()) {    //切り替えスイッチが押されたら
    ++mode;                                      //modeを1つずつ変化させる
    if(mode &gt;= Mode_Count)                       //もしMode_Countより大きくなったら
      mode = 0;                                  //0に戻す
  }
  // ロータリーエンコーダを読む、それが変化したらBankLimit_Cangeにその数値を書き込む
  if (mode == BankLimit_0_Mode) {
    BankLimit_Cange = 0;
  }
  if (mode == BankLimit_1_Mode) {
    BankLimit_Cange = 1;
  } 
  if (mode == BankLimit_2_Mode) {
    BankLimit_Cange = 2; 
  }
  if (mode == BankLimit_3_Mode) {
    BankLimit_Cange = 3; 
  }
  if (mode == BankLimit_4_Mode) {
    BankLimit_Cange = 4;  
  }
  if (mode == BankLimit_5_Mode) {
    BankLimit_Cange = 5; 
  }
  
  //####### 右パネル Part-C ##########
  //==============================================================================================
  /////////// loop内 Part-C V/S FPA 切り替えスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。一度スイッチを押したら、離してもONにする設定。
  VS_FRA_change_SwPin_val = digitalRead(VS_FRA_change_SwPin); 
  if((VS_FRA_change_SwPin_val == LOW) && (VS_FRA_change_SwPin_old_val == HIGH)) { 
    VS_FRA_change_SwPin_state = 1 - VS_FRA_change_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  VS_FRA_change_SwPin_old_val = VS_FRA_change_SwPin_val;  
  if(VS_FRA_change_SwPin_state ==1){ 
    VS_FRA_change_SW = 1;
  } else { 
    VS_FRA_change_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-C V/S エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short VSpEncDiff = (VSpEnc.read() - VSpEncPrev) *100 /4;
  
  if (VSpEncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    VSpEncPrev = 0;
    VSpEnc.write(0);
    // datarefを一時的な値にコピー
    float verSp = VerticalSpeed;
    // 一時的な値に変更を適用
    verSp += VSpEncDiff;
    // 範囲チェックを行う
    while (verSp &lt; -6000) verSp += 1;  //エアスピードが -6000 より小さい場合は 1 をプラスする（つまり-6000で止まる）
    while (verSp &gt;= 8001) verSp -= 1;  //エアスピードが 8001 より大きい場合は 1 をマイナスする（つまり8000で止まる）
    // datarefへ検証された新しいエアースピードの数値を書く
    VerticalSpeed = verSp;
    VSpeedKnob = verSp;
  }
  //==============================================================================================
  /////////// loop内 Part-C V/S FPA タクトスイッチ //////////////////
  //============================================================================================== 
  //スイッチの保持設定スクリプト。
  VS_FPA_SwPin_val = digitalRead(VS_FPA_SwPin); 
  if((VS_FPA_SwPin_val == LOW) && (VS_FPA_SwPin_old_val == HIGH)) { 
    VS_FPA_SwPin_state = 1 - VS_FPA_SwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  VS_FPA_SwPin_old_val = VS_FPA_SwPin_val; 
  if(VS_FPA_SwPin_state ==1){ 
    VS_FPA_SW = 1;
  } 
  else { 
    VS_FPA_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-C LOC タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。一度スイッチを押したら、離してもONにする設定。
  LOC_SwPin_val = digitalRead(LOC_SwPin); 
  if((LOC_SwPin_val == LOW) && (LOC_SwPin_old_val == HIGH)) { 
    LOC_SwPin_state = 1 - LOC_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  LOC_SwPin_old_val = LOC_SwPin_val;  
  if(LOC_SwPin_state ==1){ 
    LOC_SW = 1;
  }  else { 
    LOC_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-C APP タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  APP_SwPin_val = digitalRead(APP_SwPin); 
  if((APP_SwPin_val == LOW) && (APP_SwPin_old_val == HIGH)) {
    APP_SwPin_state = 1 - APP_SwPin_state;  
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  APP_SwPin_old_val = APP_SwPin_val;
  if(APP_SwPin_state ==1){ 
    APP_SW = 1;
  }  else { 
    APP_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-A AUTO 1000 切り替えスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  AUTO_1000_changeSwPin_val = digitalRead(AUTO_1000_changeSwPin);                                  
  if((AUTO_1000_changeSwPin_val == LOW) && (AUTO_1000_changeSwPin_old_val == HIGH)) { 
    AUTO_1000_changeSwPin_state = 1 - AUTO_1000_changeSwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  AUTO_1000_changeSwPin_old_val = AUTO_1000_changeSwPin_val;  
  if(AUTO_1000_changeSwPin_state ==1){ 
    AUTO_1000_changeSW = 1;
  } 
  else { 
    AUTO_1000_changeSW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-C ALTITUDE エンコーダ //////////////////
  //==============================================================================================
  // スイッチが AUTO の場合
  if (AUTO_1000_changeSW == 1) {
    short AltEncDiff = (AltEnc.read() - AltEncPrev) *1000 /4;
    if (AltEncDiff) {
      AltEncPrev = 0;
      AltEnc.write(0);
      float AltSp = Altitude;
      AltSp += AltEncDiff;
      while (AltSp &lt; -0) AltSp += 1;  
      while (AltSp &gt;= 50001) AltSp -= 1;  
      Altitude = AltSp;
      AltKnob = AltSp;
    }
  }
  // スイッチが 1000 の場合
  if (AUTO_1000_changeSW == 0) {
    short AltEncDiff = (AltEnc.read() - AltEncPrev) *100 /4;
    if (AltEncDiff) {
      AltEncPrev = 0;
      AltEnc.write(0);
      float AltSp = Altitude;
      AltSp += AltEncDiff;
      while (AltSp &lt; -0) AltSp += 1;  
      while (AltSp &gt;= 50001) AltSp -= 1;  
      Altitude = AltSp;
      AltKnob = AltSp;
    }
  }
  //==============================================================================================
  /////////// loop内 Part-C ALTITUDE エンコーダ プッシュスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。一度スイッチを押したら、離してもONにする設定。
  ALT_EncPush_SwPin_val = digitalRead(ALT_EncPush_SwPin); //ボタンの入力（HIGHかLOW）を読み取りvalに格納
                                        //入力がHIGH(ボタンが押されている)なら状態(state)を変更 
  if((ALT_EncPush_SwPin_val == LOW) && (ALT_EncPush_SwPin_old_val == HIGH)) { //LOW、HIGHを逆にすると押上たときに点灯するようになる
    ALT_EncPush_SwPin_state = 1 - ALT_EncPush_SwPin_state;  //stateは1からstateを引いた値（つまり、stateが1なら0、0なら1となる）
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  ALT_EncPush_SwPin_old_val = ALT_EncPush_SwPin_val; //valはもう古くなったので保持しておく 
  if(ALT_EncPush_SwPin_state ==1){ 
    ALT_EncPush_SW = 1;
  } 
  else { 
    ALT_EncPush_SW = 0;
  } 
  //==============================================================================================
  /////////// loop内 Part-C ALT HOLD タクトスイッチ //////////////////
  //==============================================================================================
  //スイッチの保持設定スクリプト。
  ALT_HOLD_SwPin_val = digitalRead(ALT_HOLD_SwPin);                                        
  if((ALT_HOLD_SwPin_val == LOW) && (ALT_HOLD_SwPin_old_val == HIGH)) { 
    ALT_HOLD_SwPin_state = 1 - ALT_HOLD_SwPin_state; 
    //delay(10); //この位がチャタリングが起きない（500位が安定している）
  } 
  ALT_HOLD_SwPin_old_val = ALT_HOLD_SwPin_val;  
  if(ALT_HOLD_SwPin_state ==1){ 
    ALT_HOLD_SW = 1;
  }  else { 
    ALT_HOLD_SW = 0;
  } 
  //===============================================================================================
  /////////// loop内 Part-C Part-C Teensyの電圧がONになっているかを確認 //////////////////
  //===============================================================================================
  //このLEDだけanalogWriteを使用するためTeensyに直結している。
  //ランプの輝度を50に下げている（255がフル）
  analogWrite(Teensy_Pawer_ON_LED_Pin, 50);
  //####### 中央パネル Part-B ##########
  
  
 
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  // loop内 Part-A LEDピン 74HC595 シフトレジスタ 経由 /////////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  //####### 左パネル Part-A ##########
  //==============================================================================================
  /////////// loop内 Part-A 74HC595（LED表示）シフトレジスタ  A/T ランプ //////////////////
  //==============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  
  if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 7 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 0 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 4 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }
 else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 3 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 7 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == 4 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 2 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }    
  else if (Ap_Mode == 1 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 9 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }   
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 9 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 5,4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2,3 && Warn_Flags == 0) { 
   setRegisterPin(AT_74HC595_Pin, HIGH);
  }  
  else{
    setRegisterPin(AT_74HC595_Pin, LOW);
  } 
  //==============================================================================================
  /////////// loop内 Part-A 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 4 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == 2 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
    else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == 2 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 5 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(LNAV_74HC595_Pin, HIGH);
  }  
  
  else{
    setRegisterPin(LNAV_74HC595_Pin, LOW);
  }
  //==============================================================================================
  /////////// loop内 Part-A 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 4 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  } 
   else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == 2 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  }
 else if (Ap_Mode == 1 && At_mode == 5 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  }  
 else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == -1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(VNAV_74HC595_Pin, HIGH);
  }   
  else{
    setRegisterPin(VNAV_74HC595_Pin, LOW);
  }
   //==============================================================================================
  /////////// loop内 Part-A 74HC595（LED表示）シフトレジスタ FLCH ランプ //////////////////
  //===============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 2) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  }
 else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
 else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  }
 else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  } 
else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  }
else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(FLCH_74HC595_Pin, HIGH);
  }   
  
  else{
    setRegisterPin(FLCH_74HC595_Pin, LOW);
  }
  
  //==============================================================================================
  /////////// loop内 Part-B 74HC595（LED表示）シフトレジスタ HDG HOLD ランプ //////////////////
  //==============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 2 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);
  } 
  else{
    setRegisterPin(HDG_HOLD_74HC595_Pin, LOW);
  }
  
  
  
  //####### 右パネル Part-C ##########
  //==============================================================================================
  /////////// loop内 Part-C 74HC595（LED表示）シフトレジスタ LOC & APP ランプ //////////////////
  //==============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  //LOCのLED点灯の場合
  if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯
  } 
  
  
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == 2 && Roll_Mode_Engaged == 3) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 3 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 9 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);
  }
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);
  }  
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(LOC_74HC595_Pin, HIGH);
  }  
  else{
    setRegisterPin(LOC_74HC595_Pin, LOW);  //LOCのLED消灯
  }
  
  // APPのLED点灯の場合
  if (Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 1) {   
   setRegisterPin(APP_74HC595_Pin, HIGH);  //APPののLED点灯
  }
  
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3) {  
   setRegisterPin(APP_74HC595_Pin, HIGH);  //APPののLED点灯
  }
  
  else if (Pitch_Mode_Armed == 7 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == 4 && Roll_Mode_Engaged == 3) {   
   setRegisterPin(APP_74HC595_Pin, HIGH);  //APPののLED点灯
  }
  
  else if (Pitch_Mode_Armed == -1 && Pitch_Mode_Engaged == 6 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3) {   
   setRegisterPin(APP_74HC595_Pin, HIGH);  //APPののLED点灯
  }
 
  else if (Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3) {  
   setRegisterPin(APP_74HC595_Pin, HIGH);  //APPののLED点灯
  }
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 1 && Roll_Mode_Armed == 3 && Roll_Mode_Engaged == 5 && Warn_Flags == 0) { 
   setRegisterPin(APP_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(APP_74HC595_Pin, HIGH);  //LOCのLED点灯 
  }
  else if (Ap_Mode == 1 && At_mode == -1 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 8 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(APP_74HC595_Pin, HIGH);
  } 
  else if (Ap_Mode == 1 && At_mode == 4 && Fd_Visible == 1 && Pitch_Mode_Armed == 6 && Pitch_Mode_Engaged == 5 && Roll_Mode_Armed == -1 && Roll_Mode_Engaged == 3 && Warn_Flags == 0) { 
   setRegisterPin(APP_74HC595_Pin, HIGH);
  } 
  
  else{
    setRegisterPin(APP_74HC595_Pin, LOW);
  }
  //==============================================================================================
  /////////// loop内 Part-C 74HC595（LED表示）シフトレジスタ TOGA ランプ //////////////////
  //==============================================================================================
  // このパートはまだ調整中！これ以外で点灯するなら、以下に追加していくことになる。
  // ①Ap_Mode = (T7Avionics/ap/ap_mode);
  // ②At_mode = (T7Avionics/ap/at_mode);
  // ③Fd_Visible = (T7Avionics/ap/fd_visible);
  // ④Pitch_Mode_Armed = (T7Avionics/ap/pitch_mode_armed);
  // ⑤Pitch_Mode_Engaged = (T7Avionics/ap/pitch_mode_engaged);
  // ⑥Roll_Mode_Armed = (T7Avionics/ap/roll_mode_armed);
  // ⑦Roll_Mode_Engaged = (T7Avionics/ap/roll_mode_engaged);
  // ⑧Warn_Flags = (T7Avionics/ap/warn_flags);
  
  if (Ap_Mode == 1 && At_mode == 0 && Fd_Visible == 0 && Pitch_Mode_Armed == 0 && Pitch_Mode_Engaged == 0 && Roll_Mode_Armed == 0 && Roll_Mode_Engaged == 0 && Warn_Flags == 0) { 
   setRegisterPin(Toga_74HC595_Pin, HIGH);
  } 
  else{
    setRegisterPin(Toga_74HC595_Pin, LOW);
  }
  
}
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  /////////// 関数 LEDピン 74HC595（出力）シフトレジスタ経由 ///////////
  ////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  //####### 左パネル Part-A ##########
  //==============================================================================================
  /////////// 関数 Part-A 74HC595（LED表示）シフトレジスタ A/P ランプ //////////////////
  //==============================================================================================
  void updateAutoPilotSwLED(long value) {
    if (value == 1)  {      //T7Avionics/ap/ap_modeを見ている★
      setRegisterPin(AP_74HC595_Pin, HIGH);    //点灯　（0は74HC595のピン番号）
    } 
    else if (value == 3)  { 
      setRegisterPin(AP_74HC595_Pin, HIGH);    //点灯　
    }
    else {
      setRegisterPin(AP_74HC595_Pin, LOW);    //消灯
    }
  }
  //==============================================================================================
  /////////// 関数 Part-A 74HC595（LED表示）シフトレジスタ  A/T ランプ //////////////////
  //==============================================================================================
  //2つ以上のdatarefの組み合わせのためloop内で処理しているのでここには記述しない。
  
  //==============================================================================================
  /////////// 関数 Part-A 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  //loop内で処理しているのでここには記述しない。
  
  //==============================================================================================
  /////////// 関数 Part-A 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  //loop内で処理しているのでここには記述しない。
  //==============================================================================================
  /////////// 関数 Part-A 74HC595（LED表示）シフトレジスタ FLCH ランプ //////////////////
  //==============================================================================================
  //loop内で処理しているのでここには記述しない。
  
  
  //####### 中央パネル Part-B ##########
  //==============================================================================================
  /////////// 関数 Part-B 74HC595（LED表示）シフトレジスタ TOGA ランプ //////////////////
  //==============================================================================================
  //loop内で処理しているのでここには記述しない。
  //==============================================================================================
  /////////// 関数 Part-B 74HC595（LED表示）シフトレジスタ DISK ランプ //////////////////
  //==============================================================================================
  void updateDiskSwLED(long value) {
    if (value == 0) {        //T7Avionics/ap/pitch_mode_engagedを見ている
      setRegisterPin(Disk_74HC595_Pin, LOW);    //点灯
    } 
    else if (value == 8) {    
      setRegisterPin(Disk_74HC595_Pin, HIGH);    //点灯
    } 
    else {
      setRegisterPin(Disk_74HC595_Pin, LOW);    //消灯
    }
  }
  //==============================================================================================
  /////////// 関数 Part-B 74HC595（LED表示）シフトレジスタ BANK LIMIT 6モード切り替え ランプ ////////////////
  //==============================================================================================
  void updateBankLimit_chengeLED(long value) {
    if (value == 0)  {   
      setRegisterPin(bankAUTO_74HC595_Pin, HIGH);
      setRegisterPin(bank5_74HC595_Pin, LOW);
      setRegisterPin(bank10_74HC595_Pin, LOW);
      setRegisterPin(bank15_74HC595_Pin, LOW);
      setRegisterPin(bank20_74HC595_Pin, LOW);
      setRegisterPin(bank25_74HC595_Pin, LOW);
    } 
    else if (value == 1)  {
      setRegisterPin(bankAUTO_74HC595_Pin, LOW);
      setRegisterPin(bank5_74HC595_Pin, HIGH); 
      setRegisterPin(bank10_74HC595_Pin, LOW);
      setRegisterPin(bank15_74HC595_Pin, LOW);
      setRegisterPin(bank20_74HC595_Pin, LOW);
      setRegisterPin(bank25_74HC595_Pin, LOW);  
    } 
    else if (value == 2)  {
      setRegisterPin(bankAUTO_74HC595_Pin, LOW);
      setRegisterPin(bank5_74HC595_Pin, LOW);
      setRegisterPin(bank10_74HC595_Pin, HIGH);
      setRegisterPin(bank15_74HC595_Pin, LOW);
      setRegisterPin(bank20_74HC595_Pin, LOW);
      setRegisterPin(bank25_74HC595_Pin, LOW);   
    } 
   else if (value == 3)  {
      setRegisterPin(bankAUTO_74HC595_Pin, LOW);
      setRegisterPin(bank5_74HC595_Pin, LOW);
      setRegisterPin(bank10_74HC595_Pin, LOW);
      setRegisterPin(bank15_74HC595_Pin, HIGH); 
      setRegisterPin(bank20_74HC595_Pin, LOW);
      setRegisterPin(bank25_74HC595_Pin, LOW);  
    } 
    else if (value == 4)  { 
      setRegisterPin(bankAUTO_74HC595_Pin, LOW);
      setRegisterPin(bank5_74HC595_Pin, LOW);
      setRegisterPin(bank10_74HC595_Pin, LOW);
      setRegisterPin(bank15_74HC595_Pin, LOW);
      setRegisterPin(bank20_74HC595_Pin, HIGH);
      setRegisterPin(bank25_74HC595_Pin, LOW);  
    } 
    else if (value == 5)  {
      setRegisterPin(bankAUTO_74HC595_Pin, LOW);
      setRegisterPin(bank5_74HC595_Pin, LOW);
      setRegisterPin(bank10_74HC595_Pin, LOW);
      setRegisterPin(bank15_74HC595_Pin, LOW);
      setRegisterPin(bank20_74HC595_Pin, LOW);
      setRegisterPin(bank25_74HC595_Pin, HIGH);  
    } 
  }
  /*
  //==============================================================================================
  /////////// 関数 Part-B 74HC595（LED表示）シフトレジスタ HDG HOLD ランプ //////////////////
  //==============================================================================================
  //T7Avionics/ap/roll_mode_engaged
  void updateHeadingTrackHoldSwLED(long value) {
    if (value == 0)  {            
      setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);    //点灯
    }
   else if (value == 9)  {            
      setRegisterPin(HDG_HOLD_74HC595_Pin, HIGH);    //点灯
    } 
    else {
      setRegisterPin(HDG_HOLD_74HC595_Pin, LOW);     //消灯
    }
  }
  */
  
  //####### 右パネル Part-C ##########
  //==============================================================================================
  /////////// 関数 Part-C 74HC595（LED表示）シフトレジスタ V/S FPA ランプ //////////////////
  //==============================================================================================
  //ここはT7Avionics/ap/pitch_mode_engagedの値を見ている
  void updateVsFpaReferenceSwLED(long value) {
    if (value == 2) {       
      setRegisterPin(VS_FPA_74HC595_Pin, HIGH);    //点灯
      //lc4.shutdown(0, false);              //規定の高度に達したら7セグの表示が消える（true）
    } 
    else if (value == 9) {       
      setRegisterPin(VS_FPA_74HC595_Pin, HIGH);    //点灯
      //lc4.shutdown(0, false);              //規定の高度に達したら7セグの表示が消える（true）
    } 
   else {
      setRegisterPin(VS_FPA_74HC595_Pin, LOW);   //消灯
      //lc4.shutdown(0, true);               //VreticalSpeedのボタンをクリックしたら7セグを表示（false）
    }
  }
  //==============================================================================================
  /////////// 関数 Part-C 74HC595（LED表示）シフトレジスタ AUTO/1000チェンジ ランプ //////////////////
  //==============================================================================================
  void updateAUTO_1000_chengeLED(long value) {
    if (value == 1)  {   
      setRegisterPin(upAUTO_74HC595_Pin, HIGH);
      setRegisterPin(up1000_74HC595_Pin, LOW);
    } 
    if (value == 0)   {
      setRegisterPin(upAUTO_74HC595_Pin, LOW); 
      setRegisterPin(up1000_74HC595_Pin, HIGH);  
    } 
  }
  //==============================================================================================
  /////////// 関数 Part-C 74HC595（LED表示）シフトレジスタ ALT HOLD ランプ //////////////////
  //==============================================================================================
  //T7Avionics/ap/pitch_mode_engagedを見ている
  void updateAltitudeHoldSwLED(long value) {
    if (value == 1) { 
      setRegisterPin(ALT_HOLD_74HC595_Pin, HIGH);  //点灯  
    } else{ 
      setRegisterPin(ALT_HOLD_74HC595_Pin, LOW);  //消灯
    } 
  }
  //==============================================================================================
  /////////// 関数 Part-C 74HC595（LED表示）シフトレジスタ LOC ランプ //////////////////
  //==============================================================================================
  //LOCは複雑でこの１つのdatarefではコントロールできないのでloop内で処理する。ここでは使用しない。
/*
  //==============================================================================================
  /////////// 関数 Part-C 74HC595（LED表示）シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  //APPは複雑でこの１つのdatarefではコントロールできないのでloop内で処理する。ここでは使用しない
  // T7Avionics/ap/pitch_mode_armed
  void updateApproachSwLED(long value) {
    if (value == -1) {             
      setRegisterPin(APP_74HC595_Pin, HIGH);    //点灯
    } 
    else if (value == 6) {             
      setRegisterPin(APP_74HC595_Pin, HIGH);    //点灯
    } 
    else{      
      setRegisterPin(APP_74HC595_Pin, LOW);    //点灯
    } 
  }
  */
</code></pre></div>



<p><strong>この記事の関連記事</strong></p>



<figure class="wp-block-embed is-type-wp-embed is-provider-mac wp-block-embed-mac"><div class="wp-block-embed__wrapper">
		<div class="ystdb-card is-horizon" >
			<div class="ystdb-card__container is-horizon has-image-align-">
									<figure class="ystdb-card__image is-fit is-size--normal">
						<img decoding="async" src="https://polo-web.com/wp-content/uploads/2025/09/自作X-Planeアイキャッチ画像-01-4.jpg" alt="">					</figure>
								<div class="ystdb-card__text">
					<div class="ystdb-card__title">
						<a class="ystdb-card__link" href="https://polo-web.com/2025/09/06/b777-wordliner-autopilot-panel-custom-made-x-plane-11/">B777 Wordlinerオートパイロットパネルの自作 &#8211; X-Plane 11 &#8211; Macな暮らし</a>
					</div>
											<div class="ystdb-card__dscr">
							B777 Wordliner配線図 代表的な部品ABCDの４つ、それぞれ1点ずつ選んだ基本配線です。Teensyのピンはここで作成しているプログラムに沿ってピン						</div>
																<div class="ystdb-card__domain">polo-web.com</div>
									</div>
			</div>
		</div>
		
</div></figure>



<figure class="wp-block-embed is-type-wp-embed is-provider-mac wp-block-embed-mac"><div class="wp-block-embed__wrapper">
		<div class="ystdb-card is-horizon" >
			<div class="ystdb-card__container is-horizon has-image-align-">
									<figure class="ystdb-card__image is-fit is-size--normal">
						<img decoding="async" src="https://polo-web.com/wp-content/uploads/2025/09/自作X-Planeアイキャッチ画像-01-2.jpg" alt="">					</figure>
								<div class="ystdb-card__text">
					<div class="ystdb-card__title">
						<a class="ystdb-card__link" href="https://polo-web.com/2025/09/06/programming-examples-for-the-five-components-used-in-the-b777-wordliner-project/">B777 Wordlinerプロジェクトで使われている5つの部品のプログラミング例 &#8211; Macな暮らし</a>
					</div>
											<div class="ystdb-card__dscr">
							個別のプログラミング例 まず、このB777 Wordlinerプロジェクトでは5つの種類の部品が使われています。 トグルスイッチ タクトスイッチ（大） タクトス						</div>
																<div class="ystdb-card__domain">polo-web.com</div>
									</div>
			</div>
		</div>
		
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>X-Plane Teensy &#038; I2C接続キャラクターLCDモジュール</title>
		<link>https://polo-web.com/x-plane-teensy-i2c-character-lcd-module/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 20 Mar 2025 01:25:36 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=1588</guid>

					<description><![CDATA[X-Plane&#38;nbsp;コクピットの自作に挑戦！ Teensyでは「DogLcd」という特別のLCDが使われています。一般的には沢山のピンを使って …]]></description>
										<content:encoded><![CDATA[
<p><strong>X-Plane&nbsp;コクピットの自作に挑戦！</strong></p>



<p>Teensyでは「DogLcd」という特別のLCDが使われています。一般的には沢山のピンを使ってTeensyと繋ぐLCDが使われていますが、I2CというタイプのLCDを使うと少ない接続（3本の信号線）で無駄なく使えるようになります、限られたピンなのでこれ以外の選択肢はないでしょう。<br><br>秋月電子通商の<a href="http://akizukidenshi.com/catalog/g/gP-05693/">I2C接続キャラクターLCDモジュール　16✕2行白色バックライト付</a>　（ACM1602NI）です。I2Cタイプだったら、他の安いのでも大丈夫だと思います。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="323" height="134" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-1.png" alt="" class="wp-image-16094" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-1.png 323w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-1-300x124.png 300w" sizes="auto, (max-width: 323px) 100vw, 323px" /><figcaption class="wp-element-caption">ACM1602NI-FLW-FBW-M01　800円</figcaption></figure>
</div>


<p>Tennsyでは5（SCL）、6（SDA）番ピンが使用可能になっています。このピン以外は使用できません。<br>このピンを使うと2線式でi2Cディバイスと通信することができ、Arduinoの普通のスクリプトを理解し、表示できるようになっています。<br>以下のサイトから、2つのACM1602NIを使う為のドライバとなるライブラリをインストールします。<br><br><a href="http://100year.cocolog-nifty.com/blog/2012/05/arduinoliquidcr.html">ここに下２つのライブラリがあります</a>のでダウンロードします。（下２つも同じリンクです）<br><br>● <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-ys-red-color">LcdCore.h</mark>：これはLCDのコア部分になるライブラリです。</strong><br><a href="http://100year.cocolog-nifty.com/blog/2012/05/arduinoliquidcr.html">「LcdCore_20120528.zip」</a>をダウンロード<br><br>● <strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-ys-red-color">LCD_ACM1602NI.h</mark>：（秋月I2C液晶用）このライブラリをLcdCoreと一緒に使うことにより、元のLiquidCrystal（液晶ディスプレイを4本または8本のデータラインとして繋ぐとき）ライブラリと同様に動作します。</strong><br><a href="http://100year.cocolog-nifty.com/blog/2012/05/arduinoliquidcr.html">「LCD_ACM1602NI_20120528.zip」</a>をダウンロード</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="255" height="95" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-6.png" alt="" class="wp-image-1769"/></figure>
</div>


<p>ダウンロードすると、この２つのフォルダ毎　Arduino.app/Contents/Resources/Java/libraries フォルダの中にそのまま入れれば完了です。<br>あるいはArduinoのスケッチメニューから「ファイルを追加」からでも入れることができるのかな？やったことありません。<br><br>本当にありがとうございます。これで何の苦労もなくACM1602NIがつかえるようになります。<br>下の回路図ではLCDの3番と6番で構成されている可変抵抗はLCDの輝度を調整します。丁度いい状態になったとき文字が表示されるようになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="563" height="290" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-5.png" alt="" class="wp-image-1770" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-5.png 563w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-5-300x155.png 300w" sizes="auto, (max-width: 563px) 100vw, 563px" /></figure>
</div>


<h2 class="wp-block-heading"><strong>ACM1602NIにお馴染み「hello, world!」を表示してみましょう。</strong></h2>



<p>これも、スケッチを公開している<a href="http://100year.cocolog-nifty.com/blog/2012/05/arduinoliquidcr.html">このサイト</a>から頂きました。コードにはピンの位置は書かれていませんが、Teensy2.0では5、6ピンを使うと問題ありません。</p>



<p><strong>HelloWorld.ino</strong></p>



<p>LCDを繋ぐピンの位置は、Teensy2.0では、5（SCL）、6（SDA）ピンだけです。他と重なる場合は、他を移動するしかありません。<br>※Teensy++2.0は、0（SCL）、1（SDA）ピンだけ。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-file="HelloWorld.ino" data-lang="Arduino"><code>#include &lt;Wire.h&gt;            // Arduino IDE のI2Cライブラリ
#include &lt;LcdCore.h&gt;         // LCDコアライブラリ
#include &lt;LCD_ACM1602NI.h&gt;   // 秋月I2C液晶用のI/Oライブラリ
 
LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス（Tennsy2.0では5（SCL），6（SDA）番ピンが使用可能）
 
void setup() {
  lcd.begin(16, 2);  //16文字、2行の液晶を使う場合
  lcd.print(&quot;hello, world!&quot;);
}
 
void loop() {
  lcd.setCursor(0, 1);    //（列, 行）一番左が0、一番右が19（液晶によって違う）。行も同じ。このディスプレイでは0〜2までが使える。
  lcd.print(millis()/1000);   //Arduinoをリセットしてからの秒数の取得です
}</code></pre></div>



<p><strong>X-Planeで使用する場合の例</strong></p>



<p>セスナ172SPの例としてあげています。Com1とNav1をロータリーエンコーダで上げ下げします。<br>それをX-Planeから受信して、1行目にNav1、2行目にCom1をLCDに表示します。<br>実際のdatarefでは下のように、小数点が入っていません。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="378" height="31" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-4.png" alt="" class="wp-image-1771" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-4.png 378w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-4-300x25.png 300w" sizes="auto, (max-width: 378px) 100vw, 378px" /></figure>
</div>


<p>従ってこのように小数点がない状態で表示されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="254" height="72" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-3.png" alt="" class="wp-image-1772"/></figure>
</div>


<p>※中の数字はダミー<br><br>小数点を入れるには、136025という数値の3桁目に小数点を入れたいので1000で割ります。結果は136.025ですね。しかし、まだ問題があります。<br>浮動小数点数の場合は、小数点以下第2位までLCDに出力するのがデフォルトの動作らしいのです。従って、そのまま出力すると「136.02」としが表示されないのです。<br>しかし、浮動小数点数を出力する場合は、第2パラメータの数値によって有効桁数を指定できます。&nbsp;<br>lcd.print(val, 3); と最後に桁数を指示してやると3桁まで表示してくれます。何もいれないと2桁までということになります。<br>下が小数点まで表示できるスケッチです。数値のアップダウンはエンコーダの1クリック4カウントのままです。</p>



<p><strong>X-Plane_LCD_View.ino</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-file="X-Plane_LCD_View.ino" data-lang="Arduino"><code>//I2C液晶用とロータリーエンコーダ
#include &lt;Wire.h&gt;            // Arduino IDE のI2Cライブラリ
#include &lt;LcdCore.h&gt;         // LCDコアライブラリ
#include &lt;LCD_ACM1602NI.h&gt;   // 秋月I2C液晶用のI/Oライブラリ
  
#include &lt;Encoder.h&gt;
  
LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス teensy2.0は5と6ピンと繋ぐ
  
Encoder nav = Encoder(14, 15);        // Rotary Encoder on pin 5 and 6
Encoder com = Encoder(16, 17); 
  
FlightSimInteger NavFrequencyHz;
FlightSimInteger ComFrequencyHz;
  
// variables
long encoderNav_prev=0;    // エンコーダの回転位置の変化を検出します
long encoderCom_prev=0;
elapsedMillis inactivityTimeout;// 非活動タイムアウト
  
  
  
// setup runs once, when Teensy boots.
//
void setup() {
  // 全てのハードウェアの初期化
  pinMode(14, INPUT_PULLUP); 
  pinMode(15, INPUT_PULLUP); 
  pinMode(16, INPUT_PULLUP); 
  pinMode(17, INPUT_PULLUP);
    
  lcd.begin(16, 2);    //液晶ディスプレイの初期化、LCDを16文字で2行表示、setup()の中で実行すること
                      //このlcdは最初に読み込むライブラリの中でオブジェクト化されたもので必ずこの「lcd」でないとダメ
  
  NavFrequencyHz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/nav1_frequency_hz&quot;);
    NavFrequencyHz.onChange(update_Navlcd);  // X-Planeが変化するとLCDも更新する
  ComFrequencyHz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/com1_frequency_hz_833&quot;);
    ComFrequencyHz.onChange(update_Comlcd); 
}
  
void loop() {
  FlightSim.update();
 
  // ロータリーエンコーダを読む、それが変化したらNavFrequencyHzに書き込む
  long encNav = nav.read();
  if (encNav != encoderNav_prev) {
    NavFrequencyHz = NavFrequencyHz + (encNav - encoderNav_prev);
    encoderNav_prev = encNav;
    update_Navlcd(NavFrequencyHz);
    inactivityTimeout = 0;   // 無活動タイムアウトをリセット
  }
  long encCom = com.read();
  if (encCom != encoderCom_prev) {
    ComFrequencyHz = ComFrequencyHz + (encCom - encoderCom_prev);
    encoderCom_prev = encCom;
    update_Comlcd(ComFrequencyHz);
    inactivityTimeout = 0;   // 無活動タイムアウトをリセット
  }
}
  
 float tmp; // 周波数dataref整数に小数点を置くための宣言
 
void update_Navlcd(long val){
  lcd.setCursor(0, 0);  //先頭から表示、1行目に表示
  lcd.print(&quot;Nav1:&quot;);  //先頭の文字
  tmp = val / 100.0;  //小数点以下2桁はNav1の数値を100.0で割る
  lcd.print(tmp); 
}
  
void update_Comlcd(long val){
  lcd.setCursor(0, 1);  //先頭から表示、2行目に表示
  lcd.print(&quot;Com1:&quot;);
  tmp = val / 1000.000;  //小数点以下3桁はCom1の数値を1000.0で割る
  lcd.print(tmp,3);      //小数点以下3桁まで表示するために、第２パラメータに3と入れる
}</code></pre></div>



<p>上のスケッチは2つのエンコーダでそれぞれ別々に周波数をコントロールしていますが、大きく周波数を変える時はやはり大変です。<br>X-Plane上でノブを回すように、小数点以上と以下をそれぞれ別々にやったほうが早く処理できますよね。<br><br>datarefをよく見ると、今までやったような全てのデータを一度に扱うdatarefもあるが、小数点より上と、下に分割したdatarefもあります。<br>Nav1が<br>sim/cockpit2/radios/actuators/nav1_frequency_Mhz<br>sim/cockpit2/radios/actuators/nav1_frequency_khz<br>Com1は<br>sim/cockpit2/radios/actuators/com1_frequency_Mhz<br>sim/cockpit2/radios/actuators/com1_frequency_khz<br><br>Mhzを左のエンコーダ、Khzを右のエンコーダでコントロールするようにします。Nav1とCom1の切替はプッシュボタンで行ないます。<br><br>下のスケッチ、まだ完全でありません。範囲の設定がまだです。</p>



<p><strong>ModeChenge_LCD_View.ino</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-file="ModeChenge_LCD_View.ino" data-lang="Arduino"><code>//I2C液晶用とロータリーエンコーダ
#include &lt;Wire.h&gt;            // Arduino IDE のI2Cライブラリ
#include &lt;LcdCore.h&gt;         // LCDコアライブラリ
#include &lt;LCD_ACM1602NI.h&gt;   // 秋月I2C液晶用のI/Oライブラリ
  
#include &lt;Encoder.h&gt;
#include &lt;Bounce.h&gt;
  
LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス teensy2.0は5と6ピンと繋ぐ
  
Encoder MhzEncPin = Encoder(14, 15);        // Rotary Encoder on pin 5 and 6
Encoder KhzEncPin = Encoder(16, 17);
Bounce modeSwitchPin = Bounce (10, 5);
  
FlightSimInteger Nav1FrequencyMhz;
FlightSimInteger Nav1FrequencyKhz;
FlightSimInteger Com1FrequencyMhz;
FlightSimInteger Com1FrequencyKhz;
  
// variables
long encoder_Mhz_prev=0;    // エンコーダの回転位置の変化を検出します
long encoder_Khz_prev=0;
 
elapsedMillis inactivityTimeout;// 非活動タイムアウト
  
// モードの設定
enum Modes {
  Mode_Nav1, // Nav1モード
  Mode_Com1, // Com1モード
  Mode_Count // これで自動的に2つのモードを持つことになる
};
int mode = 0; 
  
// setup runs once, when Teensy boots.
//
void setup() {
  // 全てのハードウェアの初期化
  pinMode(14, INPUT_PULLUP); 
  pinMode(15, INPUT_PULLUP); 
  pinMode(16, INPUT_PULLUP); 
  pinMode(17, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
    
  lcd.begin(16, 2);    //液晶ディスプレイの初期化、LCDを16文字で2行表示、setup()の中で実行すること
                      //このlcdは最初に読み込むライブラリの中でオブジェクト化されたもので必ずこの「lcd」でないとダメ
  
  Nav1FrequencyMhz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/nav1_frequency_Mhz&quot;);
    Nav1FrequencyMhz.onChange(update_Nav1_Mhz_lcd);  // X-Planeが変化するとLCDも更新する
  Nav1FrequencyKhz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/nav1_frequency_khz&quot;);
    Nav1FrequencyKhz.onChange(update_Nav1_Khz_lcd);
  Com1FrequencyMhz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/com1_frequency_Mhz&quot;);
    Com1FrequencyMhz.onChange(update_Com1_Mhz_lcd);
  Com1FrequencyKhz = XPlaneRef(&quot;sim/cockpit2/radios/actuators/com1_frequency_khz&quot;);
    Com1FrequencyKhz.onChange(update_Com1_Khz_lcd); 
}
  
void loop() {
  FlightSim.update();
  modeSwitchPin.update();
   
  // change mode when switch pressed
  if(modeSwitchPin.fallingEdge()) {
    ++mode;
    if(mode &gt;= Mode_Count)
      mode = 0;
  }
 
  // ロータリーエンコーダを読む、それが変化したらNavFrequencyHzに書き込む
  if (mode == Mode_Nav1) {
    long MhzEnc = MhzEncPin.read();
    if (MhzEnc != encoder_Mhz_prev) {
      Nav1FrequencyMhz = Nav1FrequencyMhz + (MhzEnc - encoder_Mhz_prev);
      encoder_Mhz_prev = MhzEnc;
      update_Nav1_Mhz_lcd(Nav1FrequencyMhz);
      inactivityTimeout = 0;   // 無活動タイムアウトをリセット
    }
    long KhzEnc = KhzEncPin.read();
    if (KhzEnc != encoder_Khz_prev) {
      Nav1FrequencyKhz = Nav1FrequencyKhz + (KhzEnc - encoder_Khz_prev);
      encoder_Khz_prev = KhzEnc;
      update_Nav1_Khz_lcd(Nav1FrequencyKhz);
      inactivityTimeout = 0;   // 無活動タイムアウトをリセット
    }
  }
  if (mode == Mode_Com1) {
    long MhzEnc = MhzEncPin.read();
    if (MhzEnc != encoder_Mhz_prev) {
      Com1FrequencyMhz = Com1FrequencyMhz + (MhzEnc - encoder_Mhz_prev);
      encoder_Mhz_prev = MhzEnc;
      update_Com1_Mhz_lcd(Com1FrequencyMhz);
      inactivityTimeout = 0;   // 無活動タイムアウトをリセット
    }
    long KhzEnc = KhzEncPin.read();
    if (KhzEnc != encoder_Khz_prev) {
      Com1FrequencyKhz = Com1FrequencyKhz + (KhzEnc - encoder_Khz_prev);
      encoder_Khz_prev = KhzEnc;
      update_Com1_Khz_lcd(Com1FrequencyKhz);
      inactivityTimeout = 0;   // 無活動タイムアウトをリセット
    }
  }
}
  
 float tmp; // 周波数dataref整数に小数点を置くための宣言
 
void update_Nav1_Mhz_lcd(long val){
  lcd.setCursor(0, 0);  //先頭から表示、1行目に表示
  lcd.print(&quot;Nav1:&quot;);  //先頭の文字
  lcd.print(val); 
}
void update_Nav1_Khz_lcd(long val){
  lcd.setCursor(8, 0);  //先頭から表示、1行目に表示
  lcd.print(&quot;.&quot;);
  lcd.print(val); 
}
 
void update_Com1_Mhz_lcd(long val){
  lcd.setCursor(0, 1);  //先頭から表示、2行目に表示
  lcd.print(&quot;Com1:&quot;);  //先頭の文字
  lcd.print(val); 
}
void update_Com1_Khz_lcd(long val){
  lcd.setCursor(8, 1);  //先頭から表示、2行目に表示
  lcd.print(&quot;.&quot;);
  lcd.print(val); 
}</code></pre></div>



<p>小数点以下を扱う場合はチョット変更が必要になる。<br>8行目の FlightSimFloat（これにより小数点以下を扱うことが出来る）と、LCDの表示には最後の行のlcd.print(NavFrequencyHz,6);のように第2パラメーターとして表示する桁数を入れる必要がある。ここでは6桁を指定している。<br>以下はX-Planeのフラップの状態（dataref）を単純に読み込んでいるのだが、小数点以下も読み込めるのでほとんどのデータを表示できる。</p>



<p><strong>Simple_LCD_View.ino</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-file="Simple_LCD_View.ino" data-lang="Arduino"><code>//小数点まで表示する I2C液晶用LCD
#include &lt;Wire.h&gt;            // Arduino IDE のI2Cライブラリ
#include &lt;LcdCore.h&gt;         // LCDコアライブラリ
#include &lt;LCD_ACM1602NI.h&gt;   // 秋月I2C液晶用のI/Oライブラリ
  
LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス teensy2.0は5と6ピンと繋ぐ
  
FlightSimFloat NavFrequencyHz;
 
long encoderNav_prev=0;    // エンコーダの回転位置の変化を検出します
 
elapsedMillis inactivityTimeout;// 非活動タイムアウト
  
void setup() {   
  lcd.begin(16, 2);    //液晶ディスプレイの初期化、LCDを16文字で2行表示、setup()の中で実行すること
                      //このlcdは最初に読み込むライブラリの中でオブジェクト化されたもので必ずこの「lcd」でないとダメ 
  NavFrequencyHz = XPlaneRef(&quot;sim/flightmodel2/controls/flap1_deploy_ratio&quot;);
}
 
 float tmp; // 周波数dataref整数に小数点を置くための宣言
  
void loop() {
  FlightSim.update();
  lcd.setCursor(0, 0);
  lcd.print(NavFrequencyHz,6);
}</code></pre></div>



<p>アップダウンの別の変化の仕方は<a href="file:///Users/polo/Local%20Sites/polo-web.local/app/public/old/X-Plane-DIY_HomeMade_CockpitPanel/(null)/(null)">ここで</a>解説しています。</p>



<p>後は、余談ですがteensyのUSB FlightSimの例の中にある「FrameRateDisplay」はLCDモジュールにフレームレートを表示するスケッチですが、i2CのLCDでも以下の設定で表示できます。<br>ちなみに、X-Planeでフレームレートを表示するには、設定＞データ入力/出力 で freme rate にチェックを入れると表示されるので比較してみるとわかります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="196" height="83" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1588-2.png" alt="" class="wp-image-1773"/></figure>
</div>


<p><strong>FrameRateDisplay_i2c.ino</strong></p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-file="FrameRateDisplay_i2c.ino" data-lang="Arduino"><code>//小数点まで表示する I2C液晶用LCD
#include &lt;Wire.h&gt;            // Arduino IDE のI2Cライブラリ
#include &lt;LcdCore.h&gt;         // LCDコアライブラリ
#include &lt;LCD_ACM1602NI.h&gt;   // 秋月I2C液晶用のI/Oライブラリ
   
LCD_ACM1602NI lcd(0xa0); // 0xa0はI2Cアドレス teensy2.0は5と6ピンと繋ぐ
   
FlightSimElapsedFrames frameCount; // increases each simulation frame 各シミュレーションフレームを1つずつ増加させる
elapsedMillis milliSeconds;        // 毎秒1000で増加
  
void setup() {   
  lcd.begin(16, 2);    //液晶ディスプレイの初期化、LCDを16文字で2行表示、setup()の中で実行すること
                      //このlcdは最初に読み込むライブラリの中でオブジェクト化されたもので必ずこの「lcd」でないとダメ 
  
  pinMode(LED_BUILTIN, OUTPUT);  //teensyの11ピンに出力
}
  
 
void loop() {
  FlightSim.update();
  // X-Planeが実行されている場合、Teensy11ピンのLEDが表示され、プラグインが有効になります。
  if (FlightSim.isEnabled()) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
   
  // すべて10フレーム、フレームレートの表示を更新します
  if (frameCount &gt;= 10) {
    // read the elapsed frames and elapsed time
    // 経過フレームと経過時間を読み取ります
    int frames = frameCount;
    int ms = milliSeconds;
 
    // ゼロの両方をリセット（すぐに読んだ後）
    milliSeconds = 0;
    frameCount = 0;
 
    // 計算し、秒あたりのフレーム数を示します
    float fps = (float)frames / (float)ms * 1000.0;
    lcd.setCursor(0, 0);
    lcd.print(fps);
    lcd.print(&quot; fsp    &quot;);
  }
}</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>B747-400 auto-pilot cockpit of X-Plane ７セグメント</title>
		<link>https://polo-web.com/b747-400-auto-pilot-cockpit-of-x-plane-7-segment-2/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 20 Mar 2025 01:07:47 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=1618</guid>

					<description><![CDATA[7セグメント この7セグメントは回路図も難関ですが、スケッチも更に大変です。英語のあらゆるサイトを見て回って問題を解決していきました。現在は、全てパーフェク …]]></description>
										<content:encoded><![CDATA[
<p><strong>7セグメント</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="594" height="74" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1618-2.jpg" alt="" class="wp-image-1764" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1618-2.jpg 594w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1618-2-300x37.jpg 300w" sizes="auto, (max-width: 594px) 100vw, 594px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="112" height="51" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1618-1.jpg" alt="" class="wp-image-1765"/></figure>
</div>


<p>この7セグメントは回路図も難関ですが、スケッチも更に大変です。英語のあらゆるサイトを見て回って問題を解決していきました。<br>現在は、全てパーフェクトに動作しています。<br>難しいものに挑戦するおもしろさも体験することが出来ます。なんといっても実施にX-Planeを操縦しながら数値が自在に回って表示されるという快感はたまりません。<br>7セグメントで表示する数値はX-Planeから取得しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="442" height="429" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1618.jpg" alt="" class="wp-image-1766" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1618.jpg 442w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1618-300x291.jpg 300w" sizes="auto, (max-width: 442px) 100vw, 442px" /></figure>
</div>


<p>ここではMAX7219を使用しています。これは多少値段が高いのですがピン数を減らすことができますし8桁まで表示することが出来ます。もし7セグでやるのでした必需品だと思います。<br>3桁の7セグを使用して、VS と ALT は3桁を2つずつ使用して6桁にしています。不要な桁がでますが、その分は表示しないように設定しました。<br><br><strong>B747-400　7セグメント：SPD</strong>（Teensyのピンを3つ使用、どれでも可）<br>X-Plane画面のSELスイッチでノットとマッハを切り替えると、エンコーダもそれに合わせて数値を変化させることができます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-lang="Arduino"><code>#include &lt;LedControl.h&gt;
 
  const int lc2_DIN_Pin = 31;    //7セグ、teensyピン位置
  const int lc2_CLK_Pin = 32;  
  const int lc2_LOAD_Pin = 33;    
  //入力：DINピン、CLK端子、LOAD端子、チップ数（MAX7219の数）
  LedControl lc2 = LedControl(lc2_DIN_Pin, lc2_CLK_Pin, lc2_LOAD_Pin, 1);
 
  FlightSimInteger AirSpeed_KnotMach_change;    //ノットとマッハの切り替え用
  FlightSimInteger AirSpeed_knot;               //７セグ用
 
  FlightSimFloat AirSpeed_mach_float;          //小数点以下のデータを取得、７セグ用
  float mach_FloatValue;                       //小数点の数値を一時格納
  int mach_IntValue;                           //小数点を整数に変換した数値を入れる
 
void setup() {
  lc2.shutdown(0, false);  // ディスプレイをオンに（0が最初のチップ）
  lc2.setIntensity(0, 15); // 15 = brightest
  lc2.clearDisplay(0);// 画面クリア（これ外しても同じ動作、意味不明）
  //mydisplay.setScanLimit(0, 3); // 表示する桁数の指定（最初は行数、2番めが桁数、0が1桁、1が2桁…）
 
  pinMode(lc2_DIN_Pin, OUTPUT);
  pinMode(lc2_CLK_Pin, OUTPUT);
  pinMode(lc2_LOAD_Pin, OUTPUT);
 
  AirSpeed_KnotMach_change = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed_is_mach&quot;);
  AirSpeed_knot = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed&quot;);  //７セグ用
  AirSpeed_mach_float = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed&quot;);  //X-Planeから浮動小数点の数値を取得 
}
// setup end
     
void loop() {
  FlightSim.update();
   
  if (AirSpeed_KnotMach_change == 0) { 
    int spd_act_keta1 = AirSpeed_knot % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
    int spd_act_keta2 = AirSpeed_knot / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
    int spd_act_keta3 = AirSpeed_knot / 100;   //例えば123の数字の場合、123÷100＝1.23で1の整数が3桁目の数字として表示
 
    lc2.setDigit(0, 0, spd_act_keta1, false); //1桁目の値を表示
    lc2.setDigit(0, 1, spd_act_keta2, false); //2桁目の値を表示
    lc2.setDigit(0, 2, spd_act_keta3, false); //3桁目の値を表示
  }
   
  if (AirSpeed_KnotMach_change == 1) { 
    //剰余の場合は浮動小数点が使えないので
  float mach_FloatValue = AirSpeed_mach_float *100;      //所得した小数点を整数の位置にもっていく（0.12を12.00）
  mach_IntValue = (int) mach_FloatValue;                  //12.00にした分を完全な整数に変換（12にする）
   
  int alt_act_keta1 = mach_IntValue % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
  int alt_act_keta2 = mach_IntValue / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
    lc2.setDigit(0, 0, alt_act_keta1, false); //1桁目の値を表示
    lc2.setDigit(0, 1, alt_act_keta2, false); //2桁目の値を表示
    lc2.setDigit(0, 2, 0, true); //3桁目の値を表示
  }
}
//loop end</code></pre></div>



<p><strong>B747-400　7セグメント：HDG</strong>（Teensyのピンを3つ使用、どれでも可）</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-lang="Arduino"><code>#include &lt;LedControl.h&gt;
 
  const int lc3_DIN_Pin = 34;    //7セグ、teensyピン位置
  const int lc3_CLK_Pin = 35;   
  const int lc3_LOAD_Pin = 36;    
  //入力：DINピン、CLK端子、LOAD端子、チップ数（MAX7219の数）
  LedControl lc3 = LedControl(lc3_DIN_Pin, lc3_CLK_Pin, lc3_LOAD_Pin, 1);
 
  const int HDGEnc_R_Pin = 9;
  const int HDGEnc_L_Pin = 10;
  short HdgEncPrev = 0;
  FlightSimInteger headingBugLed;  //7セグ用
 
void setup() {
  lc3.shutdown(0, false);  // ディスプレイをオンに（0が最初のチップ）
  lc3.setIntensity(0, 15); // 15 = brightest
  //mydisplay.setScanLimit(0, 3); // 表示する桁数の指定（最初は行数、2番めが桁数、0が1桁、1が2桁…）
 
  pinMode(lc3_DIN_Pin, OUTPUT);
  pinMode(lc3_CLK_Pin, OUTPUT);
  pinMode(lc3_LOAD_Pin, OUTPUT);
  pinMode(HDGEnc_R_Pin, INPUT_PULLUP);
  pinMode(HDGEnc_L_Pin, INPUT_PULLUP);
 
  headingBugLed = XPlaneRef(&quot;sim/cockpit/autopilot/heading_mag&quot;);  
    headingBugLed.onChange(update_hdg_act_lcd);  
}
 
void loop() {
  FlightSim.update(); 
}
 
void update_hdg_act_lcd(long value) {    //value これで高度の数字を読み込む
int hdg_act_keta1 = value % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
int hdg_act_keta2 = value / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
int hdg_act_keta3 = value / 100;   //例えば123の数字の場合、123÷100＝1.23で1の整数が3桁目の数字として表示
    lc3.setDigit(0, 0, hdg_act_keta1, false); //1桁目の値を表示
    lc3.setDigit(0, 1, hdg_act_keta2, false); //2桁目の値を表示
    lc3.setDigit(0, 2, hdg_act_keta3, false); //3桁目の値を表示
}</code></pre></div>



<p><strong>B747-400　7セグメント：V/S</strong>（Teensyのピンを3つ使用、どれでも可）</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-lang="Arduino"><code>#include &lt;LedControl.h&gt;
 
  const int lc4_DIN_Pin = 37;    //7セグ、teensyピン位置
  const int lc4_CLK_Pin = 38;   
  const int lc4_LOAD_Pin = 39;  
  //入力：DINピン、CLK端子、LOAD端子、チップ数（MAX7219の数）
  LedControl lc4 = LedControl(lc4_DIN_Pin, lc4_CLK_Pin, lc4_LOAD_Pin, 1);
 
  FlightSimInteger VSpeedLed;
  FlightSimInteger VsFpsReferenceSwLED;   //7セグとは関係ないが関連するのでここでは必要
 
 
void setup() {
  lc4.shutdown(0, false);  // ディスプレイをオンに（0が最初のチップ） 
  //lc3.setScanLimit(0, 3); // 表示する桁数の指定（最初は行数、2番めが桁数、0が1桁、1が2桁…）
   
  pinMode(lc4_DIN_Pin, OUTPUT); 
  pinMode(lc4_CLK_Pin, OUTPUT);
  pinMode(lc4_LOAD_Pin, OUTPUT);
 
 VSpeedLed = XPlaneRef(&quot;sim/cockpit/autopilot/vertical_velocity&quot;);  //これを設定する意味が不明だが、これにより７セグがうまく動作する
    VSpeedLed.onChange(update_vs_act_lcd);  // X-Planeが更新されたらLCDを更新する（上と3つセットになる）
}
 
 
void loop() {
  FlightSim.update();
}
 
void update_vs_act_lcd(long value) {    //value これで高度の数字を読み込む
  //プラスの値の処理
  int vs_act_keta1 = value % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
  int vs_act_keta2 = value / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
  int vs_act_keta3 = value / 100 % 10;   //例えば123の数字の場合、123÷100＝1.23で1の整数が3桁目の数字として表示
  int vs_act_keta4 = value / 1000 % 10;
  //マイナスの値の処理
  int vs_act_ketaMinus1 = - value % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
  int vs_act_ketaMinus2 = - value / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
  int vs_act_ketaMinus3 = - value / 100 % 10;   //例えば123の数字の場合、123÷100＝1.23で1の整数が3桁目の数字として表示
  int vs_act_ketaMinus4 = - value / 1000 % 10;
     
    //プラスの値の処理
    lc4.setDigit(0, 0, vs_act_keta1, false); //1桁目の値を表示
    lc4.setDigit(0, 1, vs_act_keta2, false); //2桁目の値を表示
    lc4.setDigit(0, 2, vs_act_keta3, false); //3桁目の値を表示
    lc4.setDigit(0, 3, vs_act_keta4, false); //4桁目の値を表示
    //マイナスの値の処理
    lc4.setDigit(0, 0, vs_act_ketaMinus1, false); //-の1桁目の値を表示
    lc4.setDigit(0, 1, vs_act_ketaMinus2, false); //-の2桁目の値を表示
    lc4.setDigit(0, 2, vs_act_ketaMinus3, false); //-の3桁目の値を表示
    lc4.setDigit(0, 3, vs_act_ketaMinus4, false); //-の4桁目の値を表示
     
    int polomini=-1;  //-1の宣言
    int polomax=0;    //0の宣言
     
    //表示する桁数を変更する設定
    if(value == 0 ){             //もし、0と同じなら以下を実行
       lc4.setScanLimit(0, 3);  // ４桁表示にする。（最初は行数、2番めが桁数、0が1桁、1が2桁…）
       //lc4.setIntensity(0, 2); // 15 = brightest 明るさを桁数に合わせて個別に指定
    }
    else if(value &gt;= 1 && value &lt;= 99){      //もし、1~99の範囲なら以下を実行
       lc4.setScanLimit(0, 3);  // 2桁表示にする。（最初は行数、2番めが桁数、0が1桁、1が2桁…）
        
    }
    else if(value &gt;= 100 && value &lt;= 999){      //もし、999より小さいなら以下を実行
       lc4.setScanLimit(0, 3);  // 4桁表示にする。（最初は行数、2番めが桁数、0が1桁、1が2桁…）
       lc4.setIntensity(0, 5); // 15 = brightest
    }
    else if(value &gt;= 1000 && value &lt;= 9999){      //もし、999より小さいなら以下を実行
       lc4.setScanLimit(0, 3);  // 4桁表示にする。（最初は行数、2番めが桁数、0が1桁、1が2桁…）
    }
    else {
       lc4.setScanLimit(0, 5);  //そうでないなら、5桁表示にする
    }
     
     
    if(value &gt;= -99 && value &lt;= -10){       //もし、Valueが-99〜より下で-10より上なら-以下を実行
       lc4.setScanLimit(0, 2);              //3桁表示
       lc4.setChar(0,2,&#39;-&#39;,false);          //3桁目に-を表示（2は3桁目）
    }
    if(value &gt;= -999 && value &lt;= -100){     //もし、-999より下で-100より上なら以下を実行
       //lc4.setChar(0,4,&#39; &#39;,false);          //5桁目に表示している-が残るので消して下の4桁芽の-を表示
       lc4.setChar(0,4,&#39;-&#39;,false);          //5桁目に-を表示
       lc4.setIntensity(0, 10); // 15 = brightest
    }
    if(value &gt;= -9999 && value &lt;= -1000){   //もし、-9999より下で-1000より上なら-以下を実行
       lc4.setChar(0,4,&#39;-&#39;,false);          //5桁目に-を表示
    } 
}</code></pre></div>



<p><strong>B747-400　7セグメント：ALT</strong>（Teensyのピンを3つ使用、どれでも可）</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-lang="Arduino"><code>#include &lt;LedControl.h&gt;
 
  const int lc5_DIN_Pin = 40;    //7セグ、teensyピン位置
  const int lc5_CLK_Pin = 41;   
  const int lc5_LOAD_Pin = 42;   
  //入力：DINピン、CLK端子、LOAD端子、チップ数（MAX7219の数）
  LedControl lc5 = LedControl(lc5_DIN_Pin, lc5_CLK_Pin, lc5_LOAD_Pin, 1);
 
  const int ALTEnc_R_Pin = 4;
  const int ALTEnc_L_Pin = 5;
   
  FlightSimInteger AltitudeLed;
 
void setup() {
  lc5.shutdown(0, false);  // ディスプレイをオンに（0が最初のチップ）
  lc5.setIntensity(0, 15); // 15 = brightest
  //mydisplay.setScanLimit(0, 3); // 表示する桁数の指定（最初は行数、2番めが桁数、0が1桁、1が2桁…）
 
  pinMode(lc5_DIN_Pin, OUTPUT);
  pinMode(lc5_CLK_Pin, OUTPUT);
  pinMode(lc5_LOAD_Pin, OUTPUT);
 
  AltitudeLed = XPlaneRef(&quot;sim/cockpit/autopilot/altitude&quot;);  //これを設定する意味が不明だが、これにより７セグがうまく動作する
    AltitudeLed.onChange(update_alt_act_lcd);  // X-Planeが更新されたらlc4Dを更新する（上と3つセットになる） 
}
 
void loop() {
  FlightSim.update(); 
}
 
void update_alt_act_lcd(long value) {    //value これで高度の数字を読み込む
  int alt_act_keta1 = value % 10;  //例えば123の数字の場合、123÷10＝12.3で小数点以下の3が1桁の数字として表示
  int alt_act_keta2 = value / 10 % 10 ;  //例えば123の数字の場合、、÷10＝12.3、さらに10で割って、1.23で小数点以下の2が表示
  int alt_act_keta3 = value / 100 % 10;   //例えば123の数字の場合、123÷100＝1.23で1の整数が3桁目の数字として表示
  int alt_act_keta4 = value / 1000 % 10;
  int alt_act_keta5 = value / 10000 % 10;
    lc5.setDigit(0, 0, 0, false); //1桁目の値はvalueからではなかく、強制的に０（3つめの0がそれ）で表示
    lc5.setDigit(0, 1, 0, false); //2桁目の値はvalueからではなかく、強制的に０（3つめの0がそれ）で表示
    lc5.setDigit(0, 2, alt_act_keta3, false); //3桁目の値を表示
    lc5.setDigit(0, 3, alt_act_keta4, false); //4桁目の値を表示
    lc5.setDigit(0, 4, alt_act_keta5, false); //5桁目の値を表示
}</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>X-Plane B737-800 Arduinoプログラミング</title>
		<link>https://polo-web.com/x-plane-b737-800-arduino-programming/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 20 Mar 2025 01:12:32 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=1596</guid>

					<description><![CDATA[このプロジェクトは、ArduinoによるX-Plane B737-800&#38;nbsp;のオートパイロットパネルのプログラムです。このまま、コピーしてA …]]></description>
										<content:encoded><![CDATA[
<p>このプロジェクトは、ArduinoによるX-Plane B737-800&nbsp;のオートパイロットパネルのプログラムです。<br>このまま、コピーしてArduinoに貼り込んだら使えます。<br>ただし、TeensyControlsプラグインとArduinoにTeensyduinoをインストールが完了していることが必要です。<br><br>このプラグラムはX-Plaenのコマンドを使用して作成していますのでほとんど完全に動作しています。しかし完璧でない部分もあるかもしれません。<br>是非皆さんも勉強のつもりでバグの修正をお願いします。<br>それでよかったら、このプログラムを使っていただきたいとおもいます。</p>



<p>Boing 737-800 Auto Pilot.ino</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-arduino" data-lang="Arduino"><code> //B737-800 専用
  //2018年5月24日 作製開始
  //daataref は void setup() に記述されている。
   
  #include &lt;Encoder.h&gt;
  #include &lt;Bounce.h&gt;
  #include &lt;LedControl.h&gt;
  #include &lt;Encoder.h&gt;
  #undef round   //なくても動作する
   
  /////////////////////////////////////////////////////////////////////////
  // 74HC595（LED表示）シフトレジスタ 共通スクリプト //
  /////////////////////////////////////////////////////////////////////////
  int SER_dataPin = 43;   //pin 14（DS-data） on the 75HC595
  int RCLK_latchPin = 44;  //pin 12（ST_CP-latch） on the 75HC595
  int SRCLK_clockPin = 45; //pin 11（SH_CP-clock） on the 75HC595
 
  #define number_of_74hc595s 3    //シフトレジスタ74HC595の数
  #define numOfRegisterPins number_of_74hc595s * 8    //ここは変更しないこと
  boolean registers[numOfRegisterPins];  //上のレジスタの数を反映させる共通スクリプト
   
  void clearRegisters(){
    for(int i = numOfRegisterPins - 1; i &gt;=  0; i--){
       registers[i] = LOW;  //最初にLEDを全消灯（LOW）、LED点灯確認はHIGHにするとわかる（X-Planeは起動しないこと）
                           //確認の為にスタート時にLEDをON,完全にX-Planeが起動したらOFFになる。
    }
  }
 
  void writeRegisters(){
    digitalWrite(RCLK_latchPin, LOW);
    for(int i = numOfRegisterPins - 1; i &gt;=  0; i--){
      digitalWrite(SRCLK_clockPin, LOW);
      int val = registers[i];
      digitalWrite(SER_dataPin, val);
      digitalWrite(SRCLK_clockPin, HIGH);
    }
    digitalWrite(RCLK_latchPin, HIGH);
  }
  // 個々のピンをHIGかLOWに設定する
  void setRegisterPin(int index, int value){  //indexでピン位置、valueでLOWかHIGH
    registers[index] = value;
  }
  // 74HC595（LED表示）シフトレジスタ共通ここまで ///////////////////////////////
   
  elapsedMillis inactivityTimeout;// 無活動タイムアウト
   
   
  /////////////////////////////////////////////////////////////////////////
  /////////// スイッチ Teensy++2.0 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //===============================================================================================
  /////////// 0番 F/D プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int FDSwPin = 0;                    //teensy 0ピン
  Bounce FDSwitch = Bounce (FDSwPin, 100);    //チャタリング除去のためここだけ数値を上げている
  FlightSimCommand FD_Sw;
  //===============================================================================================
  /////////// １番 A/T ARM プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int ATarmSwPin = 1;                  //teensy 1ピン
  Bounce ATarmSwitch = Bounce(ATarmSwPin, 5);
  FlightSimCommand AutoThrottleARM_Sw;
  //===============================================================================================
  /////////// 2番 N1 プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int N1SwPin = 2;                     //teensy 2ピン
  Bounce N1Switch = Bounce(N1SwPin, 5);        
  FlightSimCommand N1_Sw;
  //===============================================================================================
  /////////// 3番 SPEED プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int SPEEDSwPin = 3;                     //teensy 3ピン
  Bounce SPEEDSwitch = Bounce(SPEEDSwPin, 5);        
  FlightSimCommand SPEED_Sw;
  //===============================================================================================
  /////////// 4番 VNAV プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int VNAVSwPin = 4;                     //teensy 4ピン
  Bounce VNAVSwitch = Bounce(VNAVSwPin, 5);        
  FlightSimCommand VNAV_Sw;
  //===============================================================================================
  /////////// 5番 LVL CHG プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int LVL_CHGSwPin = 5;                     //teensy 5ピン
  Bounce LVL_CHGSwitch = Bounce(LVL_CHGSwPin, 5);        
  FlightSimCommand LVL_CHG_Sw;
  //===============================================================================================
  /////////// 14番 C/O プッシュスイッチ（整数型dataref）//////////////////
  //===============================================================================================
  //6番ピン（LED点滅）の動作がおかしいので26ピンに変更した。
  const int COSwPin = 26;                     //teensy 14ピン
  Bounce COSwitch = Bounce(COSwPin, 5);        
  FlightSimCommand CO_Sw;
  //===============================================================================================
  /////////// 14番 SPD INTV プッシュスイッチ //////////////////
  //===============================================================================================
  //6番ピン（LED点滅）の動作がおかしいので26ピンに変更した。
  const int SPD_INTVSwPin = 26;                     //teensy 14ピン
  Bounce SPD_INTVSwitch = Bounce(SPD_INTVSwPin, 5);        
  FlightSimCommand SPD_INTV_Sw;
  //===============================================================================================
  /////////// Part-B HDG SEL プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int HDG_SELSwPin = 11;                     //teensy 6ピン
  Bounce HDG_SELSwitch = Bounce(HDG_SELSwPin, 5);        
  FlightSimCommand HDG_SEL_Sw;
  //===============================================================================================
  /////////// Part-B LNAV プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int LNAVSwPin = 12;                     //teensy 7ピン
  Bounce LNAVSwitch = Bounce(LNAVSwPin, 5);        
  FlightSimCommand LNAV_Sw;
  //===============================================================================================
  /////////// Part-B VCR LOC プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int VOR_LOCSwPin = 13;                     //teensy 8ピン
  Bounce VOR_LOCSwitch = Bounce(VOR_LOCSwPin, 5);        
  FlightSimCommand VOR_LOC_Sw;
  //===============================================================================================
  /////////// Part-B APP プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int APPSwPin = 14;                     //teensy 9ピン
  Bounce APPSwitch = Bounce(APPSwPin, 5);        
  FlightSimCommand APP_Sw;
  //===============================================================================================
  /////////// Part-B BANK ANGLE 5モード切り替え スイッチ //////////////////
  //===============================================================================================
  int BankAngle_up_SwPin = 15;
  Bounce BankAngle_up_SwitchPin = Bounce (BankAngle_up_SwPin, 5);
  FlightSimCommand BankAngle_up;
   
  int BankAngle_dn_SwPin = 27;
  Bounce BankAngle_dn_SwitchPin = Bounce (BankAngle_dn_SwPin, 5);
  FlightSimCommand BankAngle_dn;
  //===============================================================================================
  /////////// 10番 ALT HOLD プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int ALT_HOLDSwPin = 18;                     //teensy 10ピン
  Bounce ALT_HOLDSwitch = Bounce(ALT_HOLDSwPin, 5);        
  FlightSimCommand ALT_HOLD_Sw;
  //===============================================================================================
  /////////// 11番 V/S プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int VSSwPin = 19;                     //teensy 11ピン
  Bounce VSSwitch = Bounce(VSSwPin, 5);        
  FlightSimCommand VS_Sw;
  //===============================================================================================
  /////////// 12番 A/P ENGAGE CMD プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int AP_ENGAGE_CMDSwPin = 20;                     //teensy 12ピン
  Bounce AP_ENGAGE_CMDSwitch = Bounce(AP_ENGAGE_CMDSwPin, 5);        
  FlightSimCommand AP_ENGAGE_CMD_Sw;
  //===============================================================================================
  /////////// 13番 DISENGAGE プッシュスイッチ（コマンド）//////////////////
  //===============================================================================================
  const int DISENGAGESwPin = 21;                     //teensy 13ピン
  Bounce DISENGAGESwitch = Bounce(DISENGAGESwPin, 5);        
  FlightSimCommand DISENGAGE_Sw;
  //===============================================================================================
  /////////// 14番 ALT INTV プッシュスイッチ //////////////////
  //===============================================================================================
  //6番ピン（LED点滅）の動作がおかしいので26ピンに変更した。
  const int ALT_INTVSwPin = 26;                     //teensy 14ピン
  Bounce ALT_INTVSwitch = Bounce(ALT_INTVSwPin, 5);        
  FlightSimCommand ALT_INTV_Sw;
   
   
  /////////////////////////////////////////////////////////////////////////////
  /////////// 74HC595（LED表示）Teensy++2.0 〜シフトレジスタ経由 //////////////////
  /////////////////////////////////////////////////////////////////////////////
  //==============================================================================================
  /////////// 12番 74HC595（LED表示）シフトレジスタ F/D ランプ //////////////////
  //==============================================================================================
  const int FD_74HC595_Pin = 5;  //74HC595ピン番号
  FlightSimInteger FD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 0番 74HC595（LED表示）シフトレジスタ A/T ARM ランプ//////////////////
  //==============================================================================================
  const int AT_ARM_74HC595_Pin = 4;    //74HC595ピン番号
  FlightSimInteger AT_ARM_SwLED;        //データはフロートだが「FlightSimInteger」で大丈夫          
  //==============================================================================================
  /////////// 1番 74HC595（LED表示）シフトレジスタ N1 ランプ//////////////////
  //==============================================================================================
  const int N1_74HC595_Pin = 3;  //74HC595ピン番号
  FlightSimInteger N1_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫  
  //==============================================================================================
  /////////// 2番 74HC595（LED表示）シフトレジスタ SPEED ランプ //////////////////
  //==============================================================================================
  const int SPEED_74HC595_Pin = 2;  //74HC595ピン番号
  FlightSimInteger SPEED_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 3番 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  const int VNAV_74HC595_Pin = 1;  //74HC595ピン番号
  FlightSimInteger VNAV_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 4番 74HC595（LED表示）シフトレジスタ LVL CHG ランプ //////////////////
  //==============================================================================================
  const int LVL_CHG_74HC595_Pin = 0;  //74HC595ピン番号
  FlightSimInteger LVL_CHG_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 5番 74HC595（LED表示）シフトレジスタ HDG SEL ランプ //////////////////
  //==============================================================================================
  const int HDG_SEL_74HC595_Pin = 6;  //74HC595ピン番号
  FlightSimInteger HDG_SEL_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 6番 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  const int LNAV_74HC595_Pin = 7;  //74HC595ピン番号
  FlightSimInteger LNAV_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 7番 74HC595（LED表示）シフトレジスタ VCR LOC ランプ //////////////////
  //==============================================================================================
  const int VOR_LOC_74HC595_Pin = 8;  //74HC595ピン番号
  FlightSimInteger VOR_LOC_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 8番 74HC595（LED表示）シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  //8ピンが動作しないので13ピンを使っている。
  const int APP_74HC595_Pin = 9;  //74HC595ピン番号
  FlightSimInteger APP_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 9番 74HC595（LED表示）シフトレジスタ ALT HLD ランプ //////////////////
  //==============================================================================================
  const int ALT_HLD_74HC595_Pin = 10;  //74HC595ピン番号
  FlightSimInteger ALT_HLD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 10番 74HC595（LED表示）シフトレジスタ V/S ランプ //////////////////
  //==============================================================================================
  const int VS_74HC595_Pin = 11;  //74HC595ピン番号
  FlightSimInteger VS_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
  //==============================================================================================
  /////////// 11番 74HC595（LED表示）シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //==============================================================================================
  const int AP_ENGAGE_CMD_74HC595_Pin = 12;  //74HC595ピン番号
  FlightSimInteger AP_ENGAGE_CMD_SwLED;     //データはフロートだが「FlightSimInteger」で大丈夫。
   
  
  //-----------エンコーダ-------------------------
  //===============================================================================================
  /////////// 15-16番 COURSE エンコーダ //////////////////
  //===============================================================================================
  const int COURSE_EncR_pin = 8;//7
  const int COURSE_EncL_pin = 7;//8
 
  Encoder COURSE_Enc(COURSE_EncR_pin, COURSE_EncL_pin);
  short COURSE_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger COURSE_Encoder;
  //===============================================================================================
  /////////// 17-18番 AirSeed ENC エンコーダ //////////////////
  //===============================================================================================
  const int AirSp_EncR_pin = 10;    //teensy9ピンと繋ぐ
  const int AirSp_EncL_pin = 9;    //teensy10ピンと繋ぐ
   
  Encoder AirSp_Enc(AirSp_EncR_pin, AirSp_EncL_pin);      //エンコーダピン
  short AirSp_EncPrev = 0;
  FlightSimFloat AirSpeed;
  FlightSimInteger AirSpeed_is_mach;
  FlightSimInteger Autopilot_mode;
  //===============================================================================================
  /////////// 19-20番 HEADING エンコーダ //////////////////
  //===============================================================================================
  const int HDG_SEL_EncR_Pin = 17;
  const int HDG_SEL_EncL_Pin = 16;
   
  Encoder HDG_SEL_Enc(HDG_SEL_EncR_Pin, HDG_SEL_EncL_Pin);
  short HDG_SEL_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger HDG_SEL_Encoder;
  //===============================================================================================
  /////////// 21-22番 ALTITUDE エンコーダ //////////////////
  //===============================================================================================
  const int ALT_HLD_EncR_Pin = 23;
  const int ALT_HLD_EncL_Pin = 22;
   
  Encoder ALT_HLD_Enc(ALT_HLD_EncR_Pin, ALT_HLD_EncL_Pin);
  short ALT_HLD_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger ALT_HLD_Encoder;
  //===============================================================================================
  /////////// 23-24番 VERT SPEED エンコーダ //////////////////
  //===============================================================================================
  const int VS_EncR_Pin = 25;
  const int VS_EncL_Pin = 24;
   
  Encoder VS_Enc(VS_EncR_Pin, VS_EncL_Pin);
  short VS_EncPrev = 0;  //エンコーダの逆回転
  FlightSimInteger VS_Encoder;
   
   
void setup() {
   
  /////////////////////////////////////////////////////////////////////////
  /////////// setup内 スイッチ Teensy 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //===============================================================================================
  /////////// setup内 0番 F/D トグルスイッチ teensy 0ピン //////////////////
  //===============================================================================================
  pinMode (FDSwPin, INPUT_PULLUP);
  FD_Sw = XPlaneRef(&quot;laminar/B738/autopilot/flight_director_toggle&quot;);
  FDSwitch.rebounce(500);   //あったほうがいいかも、ご動作するから。
  //===============================================================================================
  /////////// setup内 1番 A/T ARM トグルスイッチ teensy 1ピン //////////////////
  //===============================================================================================
  pinMode(ATarmSwPin, INPUT_PULLUP);                  
  AutoThrottleARM_Sw = XPlaneRef(&quot;laminar/B738/autopilot/autothrottle_arm_toggle&quot;);
  ATarmSwitch.rebounce(500);
  //===============================================================================================
  /////////// setup内 2番 N1 プッシュスイッチ teensy 2ピン//////////////////
  //===============================================================================================
  pinMode(N1SwPin, INPUT_PULLUP);
  N1_Sw = XPlaneRef(&quot;laminar/B738/autopilot/n1_press&quot;);
  //===============================================================================================
  /////////// setup内 3番 SPEED プッシュスイッチ teensy 3ピン//////////////////
  //===============================================================================================
  pinMode(SPEEDSwPin, INPUT_PULLUP);
  SPEED_Sw = XPlaneRef(&quot;laminar/B738/autopilot/speed_press&quot;);
  //===============================================================================================
  /////////// setup内 4番 VNAV プッシュスイッチ teensy 4ピン//////////////////
  //===============================================================================================
  pinMode(VNAVSwPin, INPUT_PULLUP);
  VNAV_Sw = XPlaneRef(&quot;laminar/B738/autopilot/vnav_press&quot;);
  //===============================================================================================
  /////////// setup内 5番 LVL CHG プッシュスイッチ teensy 5ピン//////////////////
  //===============================================================================================
  pinMode(LVL_CHGSwPin, INPUT_PULLUP);
  LVL_CHG_Sw = XPlaneRef(&quot;laminar/B738/autopilot/lvl_chg_press&quot;);
  //===============================================================================================
  /////////// setup内 14番 C/O プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(COSwPin, INPUT_PULLUP); 
  CO_Sw = XPlaneRef(&quot;laminar/B738/autopilot/change_over_press&quot;);
  //===============================================================================================
  /////////// setup内 14番 SPD_INTV プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(SPD_INTVSwPin, INPUT_PULLUP); 
  SPD_INTV_Sw = XPlaneRef(&quot;laminar/B738/autopilot/spd_interv_pos&quot;);
  //===============================================================================================
  /////////// setup内 14番  プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(COSwPin, INPUT_PULLUP); 
  CO_Sw = XPlaneRef(&quot;laminar/B738/autopilot/change_over_press&quot;);
  //===============================================================================================
  /////////// setup内 6番 HDG SEL プッシュスイッチ teensy 6ピン//////////////////
  //===============================================================================================
  pinMode(HDG_SELSwPin, INPUT_PULLUP);
  HDG_SEL_Sw = XPlaneRef(&quot;laminar/B738/autopilot/hdg_sel_press&quot;);
  //===============================================================================================
  /////////// setup内 Part-B LNAV プッシュスイッチ teensy 7ピン//////////////////
  //============================================================================================
  pinMode(LNAVSwPin, INPUT_PULLUP); 
  LNAV_Sw = XPlaneRef(&quot;laminar/B738/autopilot/lnav_press&quot;);
  //===============================================================================================
  /////////// setup内 Part-B VOR LOC プッシュスイッチ teensy 8ピン//////////////////
  //============================================================================================
  pinMode(VOR_LOCSwPin, INPUT_PULLUP); 
  VOR_LOC_Sw = XPlaneRef(&quot;laminar/B738/autopilot/vorloc_press&quot;);
  //===============================================================================================
  /////////// setup内 Part-B APP プッシュスイッチ teensy 9ピン//////////////////
  //============================================================================================
  pinMode(APPSwPin, INPUT_PULLUP); 
  APP_Sw = XPlaneRef(&quot;laminar/B738/autopilot/app_press&quot;);
  //===============================================================================================
  /////////// setup内 Part-B HDG BANK ANGLE 切り替えスイッチ //////////////////
  //===============================================================================================
  pinMode(BankAngle_up_SwPin, INPUT_PULLUP);
  BankAngle_up = XPlaneRef(&quot;laminar/B738/autopilot/bank_angle_up&quot;);
  pinMode(BankAngle_dn_SwPin, INPUT_PULLUP);
  BankAngle_dn = XPlaneRef(&quot;laminar/B738/autopilot/bank_angle_dn&quot;);
  //===============================================================================================
  /////////// setup内 10番 ALT HOLD プッシュスイッチ teensy 10ピン//////////////////
  //==============================================================================================
  pinMode(ALT_HOLDSwPin, INPUT_PULLUP);
  ALT_HOLD_Sw = XPlaneRef(&quot;laminar/B738/autopilot/alt_hld_press&quot;);
  //===============================================================================================
  /////////// setup内 11番 V/S プッシュスイッチ teensy 11ピン//////////////////
  //===============================================================================================
  pinMode(VSSwPin, INPUT_PULLUP); 
  VS_Sw = XPlaneRef(&quot;laminar/B738/autopilot/vs_press&quot;);
  //===============================================================================================
  /////////// setup内 12番 A/P ENGAGE CMD プッシュスイッチ teensy 12ピン//////////////////
  //===============================================================================================
  pinMode(AP_ENGAGE_CMDSwPin, INPUT_PULLUP); 
  AP_ENGAGE_CMD_Sw = XPlaneRef(&quot;laminar/B738/autopilot/cmd_a_press&quot;);
  //===============================================================================================
  /////////// setup内 13番 DISENGAGE プッシュスイッチ teensy 13ピン//////////////////
  //===============================================================================================
  pinMode(DISENGAGESwPin, INPUT_PULLUP); 
  DISENGAGE_Sw = XPlaneRef(&quot;laminar/B738/autopilot/disconnect_toggle&quot;);
  //===============================================================================================
  /////////// setup内 14番 ALT_INTV プッシュスイッチ teensy 14ピン//////////////////
  //===============================================================================================
  pinMode(ALT_INTVSwPin, INPUT_PULLUP); 
  ALT_INTV_Sw = XPlaneRef(&quot;laminar/B738/autopilot/alt_interv_pos&quot;);
   
   
  /////////////////////////////////////////////////////////////////////////
  // setup内 LEDピン Teensy++2.0 〜 74HC595 シフトレジスタ 経由 /////////////
  /////////////////////////////////////////////////////////////////////////
  //setup内LEDランプ共通---------74HC595のピン設定
  pinMode(SER_dataPin, OUTPUT);
  pinMode(RCLK_latchPin, OUTPUT);
  pinMode(SRCLK_clockPin, OUTPUT);
  //setup内LEDランプ共通---------すべてのレジスタピンをリセット
  clearRegisters();
  writeRegisters();
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ F/D MAランプ //////////////////
  //===============================================================================================
  FD_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/master_capt_status&quot;);  //laminar/B738/autopilot/flight_director_pos
    FD_SwLED.onChange(update_FD_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ A/T ARM ランプ //////////////////
  //===============================================================================================
  AT_ARM_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/autothrottle_status&quot;);
    AT_ARM_SwLED.onChange(update_AT_ARM_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ N1 ランプ //////////////////
  //===============================================================================================
  N1_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/n1_status&quot;);
    N1_SwLED.onChange(update_N1_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ SPEED ランプ //////////////////
  //===============================================================================================
  SPEED_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/speed_status1&quot;);
    SPEED_SwLED.onChange(update_SPEED_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //===============================================================================================
  VNAV_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/vnav_status1&quot;);
    VNAV_SwLED.onChange(update_VNAV_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ LVL CHG ランプ //////////////////
  //===============================================================================================
  LVL_CHG_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/lvl_chg_status&quot;);
    LVL_CHG_SwLED.onChange(update_LVL_CHG_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ HDG SEL ランプ //////////////////
  //===============================================================================================
  HDG_SEL_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/hdg_sel_status&quot;);
    HDG_SEL_SwLED.onChange(update_HDG_SEL_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////
  //===============================================================================================
  LNAV_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/lnav_status&quot;);
    LNAV_SwLED.onChange(update_LNAV_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ VOR LOC ランプ //////////////////
  //===============================================================================================
  VOR_LOC_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/vorloc_status&quot;);
    VOR_LOC_SwLED.onChange(update_VOR_LOC_SwLED);
  //===============================================================================================.
  /////////// setup内 74HC595（LED表示）シフトレジスタ APP ランプ //////////////////
  //===============================================================================================
  APP_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/app_status&quot;);
    APP_SwLED.onChange(update_APP_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ ALT HOLD ランプ //////////////////
  //===============================================================================================
  ALT_HLD_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/alt_hld_status&quot;);
    ALT_HLD_SwLED.onChange(update_ALT_HLD_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ V/S ランプ //////////////////
  //===============================================================================================
  VS_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/vs_status&quot;);
    VS_SwLED.onChange(update_VS_SwLED);
  //===============================================================================================
  /////////// setup内 74HC595（LED表示）シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //===============================================================================================
  AP_ENGAGE_CMD_SwLED = XPlaneRef(&quot;laminar/B738/autopilot/cmd_a_status&quot;);
    AP_ENGAGE_CMD_SwLED.onChange(update_AP_ENGAGE_CMD_SwLED);
     
   
  //-----------エンコーダ-------------------------
  //===============================================================================================
  /////////// setup内 15-16番 COURSE エンコーダ  //////////////////
  //===============================================================================================
  pinMode(COURSE_EncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(COURSE_EncL_pin, INPUT_PULLUP);  //エンコーダ
  COURSE_Encoder = XPlaneRef(&quot;sim/cockpit2/radios/actuators/hsi_obs_deg_mag_pilot&quot;);
  //===============================================================================================
  /////////// setup内 17-18番 IAS/MACH（AirSpeed） エンコーダ  //////////////////
  //===============================================================================================
  pinMode(AirSp_EncR_pin, INPUT_PULLUP);  //エンコーダ
  pinMode(AirSp_EncL_pin, INPUT_PULLUP);  //エンコーダ
  AirSpeed = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed&quot;);
  AirSpeed_is_mach = XPlaneRef(&quot;sim/cockpit/autopilot/airspeed_is_mach&quot;);
  Autopilot_mode = XPlaneRef(&quot;sim/cockpit/autopilot/autopilot_mode&quot;);
  //===============================================================================================
  /////////// setup内 19-20番 HEADING エンコーダ  //////////////////
  //=============================================================================================== 
  pinMode(HDG_SEL_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(HDG_SEL_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  HDG_SEL_Encoder = XPlaneRef(&quot;sim/cockpit2/autopilot/heading_dial_deg_mag_pilot&quot;);
  //===============================================================================================
  /////////// setup内 21-22番 ALTTUDE エンコーダ //////////////////
  //===============================================================================================
  pinMode(ALT_HLD_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(ALT_HLD_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  ALT_HLD_Encoder = XPlaneRef(&quot;sim/cockpit2/autopilot/altitude_dial_ft&quot;);
  //===============================================================================================
  /////////// setup内 23-24番 VERT SPEED エンコーダ //////////////////
  //===============================================================================================
  pinMode(VS_EncR_Pin, INPUT_PULLUP);  //エンコーダ
  pinMode(VS_EncL_Pin, INPUT_PULLUP);  //エンコーダ
  VS_Encoder = XPlaneRef(&quot;sim/cockpit/autopilot/vertical_velocity&quot;);
}
 

void loop() {
  FlightSim.update();
   
  /////////////////////////////////////////////////////////////////////////
  // loop内 74HC595 シフトレジスタ 共通 //
  /////////////////////////////////////////////////////////////////////////
  writeRegisters();  //変更内容を表示するために呼び出さなければなりません
                     //必要な値が設定された後に一度だけ呼び出します。
  //////// loop内 シフトレジスタ 共通 END ///////////////////////////////////
   
  //ループ内には74HC595 シフトレジスタに関して、これ以外の設定項目は無い、全て関数設定になっている。
   
   
  /////////////////////////////////////////////////////////////////////////
  /////////// loop内 スイッチ Teensy 直結ピン //////////////////
  /////////////////////////////////////////////////////////////////////////
  //==============================================================================================
  /////////// loop内 0番 FlightDirector トグルスイッチ（コマンド）//////////////////
  //============================================================================================== 
  FDSwitch.update();
  if (FDSwitch.fallingEdge()) {
    FD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (FDSwitch.risingEdge()) {
    FD_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 １番 A/T ARM (AutoThrottle ARM) トグルスイッチ（コマンド）//////////////////
  //==============================================================================================
  ATarmSwitch.update();
  if (ATarmSwitch.fallingEdge()) {
    AutoThrottleARM_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ATarmSwitch.risingEdge()) {
    AutoThrottleARM_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 2番 N1 プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  N1Switch.update();
  if (N1Switch.fallingEdge()) {
    N1_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (N1Switch.risingEdge()) {
    N1_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 3番 SPEED プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  SPEEDSwitch.update();
  if (SPEEDSwitch.fallingEdge()) {
    SPEED_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (SPEEDSwitch.risingEdge()) {
    SPEED_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 4番 VNAV プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  VNAVSwitch.update();
  if (VNAVSwitch.fallingEdge()) {
    VNAV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VNAVSwitch.risingEdge()) {
    VNAV_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 5番 LVL CHG プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  LVL_CHGSwitch.update();
  if (LVL_CHGSwitch.fallingEdge()) {
    LVL_CHG_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (LVL_CHGSwitch.risingEdge()) {
    LVL_CHG_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 14番 C/O プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  COSwitch.update();
  if (COSwitch.fallingEdge()) {
    CO_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (COSwitch.risingEdge()) {
    CO_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 14番 SPD_INTV プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  SPD_INTVSwitch.update();
  if (SPD_INTVSwitch.fallingEdge()) {
    SPD_INTV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (SPD_INTVSwitch.risingEdge()) {
    SPD_INTV_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 6番 HDG SEL プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  HDG_SELSwitch.update();
  if (HDG_SELSwitch.fallingEdge()) {
    HDG_SEL_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (HDG_SELSwitch.risingEdge()) {
    HDG_SEL_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 Part-B LNAV プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  LNAVSwitch.update();
  if (LNAVSwitch.fallingEdge()) {
    LNAV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (LNAVSwitch.risingEdge()) {
    LNAV_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 Part-B VOR LOC プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  VOR_LOCSwitch.update();
  if (VOR_LOCSwitch.fallingEdge()) {
    VOR_LOC_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VOR_LOCSwitch.risingEdge()) {
    VOR_LOC_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 Part-B APP プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  APPSwitch.update();
  if (APPSwitch.fallingEdge()) {
    APP_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (APPSwitch.risingEdge()) {
    APP_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 Part-B BANK ANGLE 6モード切り替え スイッチ //////////////////
  //==============================================================================================
  BankAngle_up_SwitchPin.update();
  if (BankAngle_up_SwitchPin.fallingEdge()) {
    BankAngle_up = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (BankAngle_up_SwitchPin.risingEdge()) {
    BankAngle_up = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
   
  BankAngle_dn_SwitchPin.update();
  if (BankAngle_dn_SwitchPin.fallingEdge()) {
    BankAngle_dn = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (BankAngle_dn_SwitchPin.risingEdge()) {
    BankAngle_dn = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 10番パネル ALT HOLD プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  ALT_HOLDSwitch.update();
  if (ALT_HOLDSwitch.fallingEdge()) {
    ALT_HOLD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ALT_HOLDSwitch.risingEdge()) {
    ALT_HOLD_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 11番 V/S プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  VSSwitch.update();
  if (VSSwitch.fallingEdge()) {
    VS_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (VSSwitch.risingEdge()) {
    VS_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 12番 A/P ENGAGE CMD プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  AP_ENGAGE_CMDSwitch.update();
  if (AP_ENGAGE_CMDSwitch.fallingEdge()) {
    AP_ENGAGE_CMD_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (AP_ENGAGE_CMDSwitch.risingEdge()) {
    AP_ENGAGE_CMD_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 12番 DESENGADE プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  DISENGAGESwitch.update();
  if (DISENGAGESwitch.fallingEdge()) {
    DISENGAGE_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (DISENGAGESwitch.risingEdge()) {
    DISENGAGE_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
  //==============================================================================================
  /////////// loop内 14番 ALT_INTV プッシュスイッチ（コマンド） //////////////////
  //==============================================================================================
  ALT_INTVSwitch.update();
  if (ALT_INTVSwitch.fallingEdge()) {
    ALT_INTV_Sw = 1;        //押し下げしたときを検出してONにする
    inactivityTimeout = 0;
  }
  if (ALT_INTVSwitch.risingEdge()) {
    ALT_INTV_Sw = 0;        //押し上げしたときを検出状態（プッシュボタンは1にしてONを保つ必要がある）
  }
   
   
  //-----------エンコーダ-------------------------
  //==============================================================================================
  /////////// loop内 15-16番 COURSE エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short COURSE_EncDiff = (COURSE_Enc.read() - COURSE_EncPrev) / 4;
    
  if (COURSE_EncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    COURSE_EncPrev = 0;
    COURSE_Enc.write(0);
    
    // datarefを一時的な値にコピー
    float Course_tmp = COURSE_Encoder;
  
    // 一時的な値に変更を適用
    Course_tmp += COURSE_EncDiff;
     
    // do range checking（範囲チェックを行う）
    while (Course_tmp &lt; 0.0) Course_tmp += 360.0;
    while (Course_tmp &gt;= 360.0) Course_tmp -= 360.0;
  
    // datarefへ検証された新しいエアースピードの数値を書く
    COURSE_Encoder = Course_tmp;
  }
   
  //==============================================================================================
  /////////// loop内 17-18番 IAS/MACH エンコーダ //////////////////
  //==============================================================================================
  // エンコーダの動きを見る
  short AirSp_EncDiff = AirSp_Enc.read() /4;  //粗いの変更したエンコーダを読む- 変更前のエンコーダの値
      
  // それらが移動した後のエンコーダをリセット
  if (AirSp_EncDiff) {
    AirSp_EncPrev = 0;
    AirSp_Enc.write(0);
  }
    
  // encDiffは20にmyEncDiffの値（1カウント）を掛ける値になる
  int AirSpeed_mach_encDiff = 20 * AirSp_EncDiff;  //20 ✕ 1 で encDiff は20になる
    
  //ノットは、autopilot_modeが「0」で000〜392とautopilot_modeが「1」で114〜392の範囲、マッハは0.00〜0.84の範囲で動作するように設定する必要がある。
  //ノット表示
  if (AirSpeed_is_mach == 0 && (Autopilot_mode == 0 || Autopilot_mode == 1)) { 
      //小数点以下2桁からカウントアップ／ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
            
          // encDiffは20だから ✕ 0.05で1ずつカウント（１桁からカウント）となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.05; 
          while (tmp &lt; 0) tmp += 1;  //エアスピードが 100 より小さい場合は 1 をプラスする（つまり100で止まる）
          while (tmp &gt;= 392) tmp -= 1;  //エアスピードが 400 より大きい場合は 1 をマイナスする（つまり399で止まる） 
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
  //ノット表示
   
  if (AirSpeed_is_mach == 0 && (Autopilot_mode == 0 || Autopilot_mode == 2)) {   //&& = 両方同じなら
      //小数点以下2桁からカウントアップ／ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
            
          // encDiffは20だから ✕ 0.05で1ずつカウント（１桁からカウント）となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.05; 
          while (tmp &lt; 100) tmp += 1;  //エアスピードが 100 より小さい場合は 1 をプラスする（つまり100で止まる）
          while (tmp &gt;= 392) tmp -= 1;  //エアスピードが 400 より大きい場合は 1 をマイナスする（つまり399で止まる） 
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
  
  //マッハ表示
  if (AirSpeed_is_mach == 1) { 
      //小数点以下2桁からカウントアップ／ダウンを行う  
      if (AirSpeed_mach_encDiff) {      //もし20なら  
          float tmp = AirSpeed;  //tmpはX-Planeからの周波数の値を取得
            
          // encDiffは20だから ✕ 0.00005で0.01ずつカウント（小数点以下２桁からカウント）となり、その値を周波数にプラスする
          tmp += AirSpeed_mach_encDiff * 0.0005;  
          while (tmp &lt; -0.01) tmp += 0.01;  //tmpが0より小さくなった場合、8をプラスする（つまり7になる）
          while (tmp &gt;= 0.84) tmp -= 0.01;  //tmpが8以上になった場合、8を引く（つまり0になる）
          AirSpeed = tmp;
          //数値の範囲はX-Plane側で処理しているのでいらない
      }
  }
   
 
  //==============================================================================================
  /////////// loop内 19-20番 HEADING エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short HDG_SEL_EncDiff = (HDG_SEL_Enc.read() - HDG_SEL_EncPrev) / 4;
    
  if (HDG_SEL_EncDiff) {
    // only update prev when we&#39;ve reached a detent!
    //戻り止めに達した場合にのみPREVを更新！
    HDG_SEL_EncPrev = 0;
    HDG_SEL_Enc.write(0);
 
    float HDG_SEL_tmp = HDG_SEL_Encoder;  // datarefを一時的な値にコピー
    HDG_SEL_tmp += HDG_SEL_EncDiff;       // 一時的な値に変更を適用
    HDG_SEL_Encoder = HDG_SEL_tmp;        // datarefへ検証された新しいエアースピードの数値を書く
  }
  //==============================================================================================
  /////////// loop内 21-22番パネル ALTITUDE エンコーダ //////////////////
  //==============================================================================================
 
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short ALT_HLD_EncDiff = (ALT_HLD_Enc.read() - ALT_HLD_EncPrev) *100 / 4;
  if (ALT_HLD_EncDiff) {
    ALT_HLD_EncPrev = 0;
    ALT_HLD_Enc.write(0);
     
    float ALT_HLD_tmp = ALT_HLD_Encoder;
    ALT_HLD_tmp += ALT_HLD_EncDiff;
    while (ALT_HLD_tmp &lt; -1000) ALT_HLD_tmp += 1;    //エンコーダの回転による数値を-1000以上にならないように制限する。
    while (ALT_HLD_tmp &gt;= 99900) ALT_HLD_tmp -= 1;  //エンコーダの数値を99900までに制限する(実際は000000になるので7セグの方で000000になるように設定する必要がある)。
    ALT_HLD_Encoder = ALT_HLD_tmp;
  }
  //==============================================================================================
  /////////// loop内 23-24番 VERT SPEED エンコーダ //////////////////
  //==============================================================================================
  // 1クリックで4つ変化するので4で割って1つずつカウントするようにする
  short VS_EncDiff = (VS_Enc.read() - VS_EncPrev) *100 / 4;
  if (VS_EncDiff) {
    VS_EncPrev = 0;
    VS_Enc.write(0);
     
    float VS_tmp = VS_Encoder;
    VS_tmp += VS_EncDiff;
    VS_Encoder = VS_tmp;
  }
}
// ループEND
 
 
  ////////////////////////////////////////////////////////////////////////////////
  /////////// 関数 LEDピン Teensy++2.0 〜 74HC595（出力）シフトレジスタ経由 ///////////
  ////////////////////////////////////////////////////////////////////////////////
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ F/D ランプ //////////////////
  //==============================================================================================
  void update_FD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(FD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(FD_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ A/T ARM ランプ //////////////////
  //==============================================================================================
  void update_AT_ARM_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(AT_ARM_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(AT_ARM_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ  N1 ランプ //////////////////
  //==============================================================================================
  void update_N1_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(N1_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(N1_74HC595_Pin, LOW);    //点灯
    }
  }
   
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ SPEED ランプ //////////////////
  //==============================================================================================
  void update_SPEED_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(SPEED_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(SPEED_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ VNAV ランプ //////////////////
  //==============================================================================================
  void update_VNAV_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VNAV_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VNAV_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ LVL CHG ランプ //////////////////
  //==============================================================================================
  void update_LVL_CHG_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(LVL_CHG_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(LVL_CHG_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ HDG SEL ランプ //////////////////
  //==============================================================================================
  void update_HDG_SEL_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(HDG_SEL_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(HDG_SEL_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ LNAV ランプ //////////////////
  //==============================================================================================
  void update_LNAV_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(LNAV_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(LNAV_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ VOR LOC ランプ //////////////////
  //==============================================================================================
  void update_VOR_LOC_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VOR_LOC_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VOR_LOC_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ APP ランプ //////////////////
  //==============================================================================================
  void update_APP_SwLED(long value) {
    if (value == 1 || value == 2)  {
      setRegisterPin(APP_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(APP_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ ALT HOLD ランプ //////////////////
  //==============================================================================================
  void update_ALT_HLD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(ALT_HLD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(ALT_HLD_74HC595_Pin, LOW);    //点灯
    }
  }
  //==============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ V/S ランプ //////////////////
  //==============================================================================================
  void update_VS_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(VS_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(VS_74HC595_Pin, LOW);    //点灯
    }
  }
 //===============================================================================================
  /////////// 関数 74HC595（LED表示）シフトレジスタ A/P ENGAGE CMD ランプ //////////////////
  //==============================================================================================
  void update_AP_ENGAGE_CMD_SwLED(long value) {
    if (value == 1)  {
      setRegisterPin(AP_ENGAGE_CMD_74HC595_Pin, HIGH);    //消灯
    } else {
      setRegisterPin(AP_ENGAGE_CMD_74HC595_Pin, LOW);    //点灯
    }
  }</code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>X-Plane 11 B737-800 Auto pilot project</title>
		<link>https://polo-web.com/x-plane-11-b737-800-auto-pilot-project/</link>
		
		<dc:creator><![CDATA[polo-web]]></dc:creator>
		<pubDate>Thu, 20 Mar 2025 00:52:36 +0000</pubDate>
				<category><![CDATA[低価格コクピットの自作]]></category>
		<guid isPermaLink="false">https://polo-web.com/?p=1598</guid>

					<description><![CDATA[X-Planeデフォルトの機体のオートパイロット部分をアルミパネルで作成して見ました。画面内ではどうしても小さなスイッチをマウスでクリックしながら飛行すると …]]></description>
										<content:encoded><![CDATA[
<p>X-Planeデフォルトの機体のオートパイロット部分をアルミパネルで作成して見ました。<br>画面内ではどうしても小さなスイッチをマウスでクリックしながら飛行するという方法しかありませんが、これが完成すれば快適な飛行を楽しむことができるようになります。</p>



<p><strong>BOEING 737-800 完成図</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="766" height="309" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-41.jpg" alt="" class="wp-image-1721" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-41.jpg 766w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-41-300x121.jpg 300w" sizes="auto, (max-width: 766px) 100vw, 766px" /></figure>
</div>


<p><strong>基本パーツと配線図</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="766" height="467" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-40.jpg" alt="" class="wp-image-1722" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-40.jpg 766w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-40-300x183.jpg 300w" sizes="auto, (max-width: 766px) 100vw, 766px" /></figure>
</div>


<p>代表的な部品ABCの3つ、それぞれ1点ずつ選んだ基本配線です。Teensyのピンはどれを選んでも問題ありません。好きなピンを選んでプログラムにそのピン番号を指定するだけです。<br>普通はプルアップ抵抗として10KΩが入っていますが、ここでは使用していません。Teensyには全てのピンにプルアップ抵抗が内蔵されています。ただし、プログラム内でpinMode() で INPUT_PULLUPを入れる必要があります。<br><br><strong>pinMode(PIN_D7, INPUT_PULLUP);<br></strong><br>配線はスイッチの片方はGNDに繋ぎ、片方はTeensyのピンに直接繋ぎます。それだけです。但し、Teensy++2.0の6番ピン（内部LEDを点灯させるピン）は注意が必要で、うまく動作しません。６ピンだけはプルアップ抵抗を入れればこの問題は解決します。<br>右端の点線で囲んだ部分は74HC595を使って、Teensy++2.0の43、44、45の3本のピンだけで沢山のLEDをコントロールするために作成した部分で、これがあると非常に重宝します。</p>



<h2 class="wp-block-heading"><strong>実際のパネルの作成手順</strong></h2>



<p>今回作成手順を紹介したのは下の画像の中央部分、BOEING 737-800の名前が入ったパネルです。&nbsp;<br>アルミ板で作成したのでかなりカッコよくなりました。<br>上の方にあるのは7セグメントを使ってX-Planeと同期して5種類の数値を表示しています。今回はこの説明はしていません。他のページでやる予定にしています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="570" height="406" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-39.jpg" alt="" class="wp-image-1723" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-39.jpg 570w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-39-300x214.jpg 300w" sizes="auto, (max-width: 570px) 100vw, 570px" /></figure>
</div>


<p>パネルの裏面、中央少し上に見えているのがこのプロジェクトの心臓部になるTeensy++2.0で、X-Planeと交信してデータを取得したり、送ったっリするメインのボードになります。グリーンの基盤は、無償のプリント基板設計ソフト「DesignSpark PCB」で作成して中国の「seeed」に発注して作成しました。この部分だけは本格的な基盤で私にとって初めての基盤作成ということで非常に気に入っています。他の部分も最終的にはこの基盤で作成することを考えています。この基盤は、パーツを取り付けたユニバーサル基板とコネクタで接続しています。<br>グリーン基盤の下4つがteensyの少ないピン数でLEDを点灯させる為のシフトレジスタ74HC595です。<br>このおかげで、Teensyのたった3本のピン使用で全てのLEDをコントロールできます。74HC595を増やせば多くのLEDをON/OFFできます。ここでは4個使用しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="700" height="294" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-38.jpg" alt="" class="wp-image-1724" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-38.jpg 700w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-38-300x126.jpg 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>
</div>


<p>サイドの壁はなくてもまったく問題ないので作成していません。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="350" height="263" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-37.jpg" alt="" class="wp-image-1725" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-37.jpg 350w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-37-300x225.jpg 300w" sizes="auto, (max-width: 350px) 100vw, 350px" /></figure>
</div>


<p>Boeing 737-800のパネル（上下中央部分）、表面から見た完成品。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="333" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-36.jpg" alt="" class="wp-image-1726" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-36.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-36-300x200.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>ホームセンター等で売っている100✕300mm、1.5mm厚のアルミ板を断裁せずにそのまま使っています。今回の場合、2mm厚だとタクトスイッチの押下げ隙間がなくなり、カチッと動作しなくなります。1.5mm厚のこの0.5mmの差でプッシュすることが何とかできる予定でしたが、実際はうまくいかず苦労しました。その方法はこの後の方で説明します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="200" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-35.jpg" alt="" class="wp-image-1727" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-35.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-35-300x120.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>PCで文字等を作成してアルミ板に貼る透明の粘着シールです。これはかなり高粘着タイプのようで、一度貼ると貼り直しが難しいです。難しいですがこれくらいピッタリ貼り付くほうが綺麗に仕上がります。<br>一発勝負です。A４（210✕297mm）なので100✕300mmのアルミ板でギリギリ２枚作成できます。横が少し足りないのですがそこは我慢します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="400" height="400" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-34.jpg" alt="" class="wp-image-1728" style="width:400px;height:auto" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-34.jpg 400w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-34-300x300.jpg 300w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-34-150x150.jpg 150w" sizes="auto, (max-width: 400px) 100vw, 400px" /></figure>
</div>


<p>配置図を作成して透明の粘着シールにインクジェットのプリンタで印刷します。インクが乾くまでしばらく待って、半分に切断してアルミ板に台紙を剥がさずに貼り付けます。一番効率がいいのは、半分印刷して残り半分は何も印刷しません。<br>インクジェットの場合、乾いてもこすったりするとインクがハゲやすいです。そこで残りの半分をその上にカバーとして2重にに貼るとインクが剥げないパネルを作成できます。<br>この時点では、当然シールの糊面は下の台紙があるので貼り付きができません、中央と四隅をセロテープでアルミ板に仮に貼り付けていきます。<br>この時点で予定の位置にピッタリとシールを設置するのが重要です。貼り直しをしないで済むように慎重にする必要があります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="189" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-33.jpg" alt="" class="wp-image-1729" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-33.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-33-300x113.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>一番小さい黒点は円の中心になり、ポンチを打つところになります。穴あけの一番重要な所になるので図面には必ずこの位置を設定することは重要になります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-32.jpg" alt="" class="wp-image-1730" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-32.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-32-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>位置決めが終了したら片側半分だけ仮止めのセロテープを外して、カッターで下の台紙を切って分離させ、シールを台紙から剥がします。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-31.jpg" alt="" class="wp-image-1731" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-31.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-31-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>以下のシール貼りは画像がなかったので他から借りました、すでに穴が空いていますが、穴が空いていない状態で貼ります。<br>最初にアルミ板に穴を開けるとシールを合わせるのが難しいのです。</p>



<p>シール貼りの要領は、切り離したシールをはがし、はがしたところから外側に向けて指先で少しずつ丁寧に空気を追い出すように押さえていきます。<br>一度にやってしまうと必ず空気が入り込み失敗しますので、なるべく少しずつ外側に向かって押さえて行くのがベストです。<br>このやり方だと結構うまくいきます。半分ずつ中央から左右の外側に向かって貼っていくというわけですね。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-30.jpg" alt="" class="wp-image-1732" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-30.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-30-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>半分済んだら、今度は逆の方の台紙を剥がして同じように押さえていきます。半分が済むと後の半分は楽に作業ができるようになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-29.jpg" alt="" class="wp-image-1733" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-29.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-29-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>張り込み作業の最後にところです。右向こうのシールの台紙を少しずつ引っ張りながら、空気が入らないように細心の注意を払ってシールを指先で押さえて作業をする必要があります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="375" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-28.jpg" alt="" class="wp-image-1734" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-28.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-28-300x225.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>下の画像はB777の分ですが、アルミ板に穴を開ける前にシールを貼った状態です。このやり方が良いと思います。<br>この後更に、もう一枚透明のシールを重ねて貼ります。これでインクの剥がれを防ぐことができます。<br>この状態で穴開けすると位置ずれを気にしなくて穴を開けることができます。</p>



<p>穴を開ける中心位置にポンチで印を付けていきます。この作業重要です。適当にやると位置がずれて後で苦労するので慎重にやりましょう。<br>このシールで作成した図は、ラインの色が茶色になっていますが、色はグレーがいいです。我が家のプリンターのインクがダメなのかもしれませんが、色付きだとしばらく使っていると色落ちしてかなり薄くなってしまいます。黒色の文字はあんまり色落ちしませんでした。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="222" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-27.jpg" alt="" class="wp-image-1735" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-27.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-27-300x133.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>ドリルで穴あけ作業をします。できればボール盤などしっかりした状態で作業した方が間違いないのですが、私は持っていないので電気ドリルで作業しました。</p>



<p>いきなりドリルを使うと位置がずれたりするので、まずこの精密ピンドリル（下の画像）ドリル経は0.5mmくらいの細いもので穴あけを開始します。<br>折れやすいので、力の入れ加減に注意して作業を行ってください。<br>それから徐々に大きいドリルに変更して少しずつ広げる方が、最後の仕上げでのバリを減らすこともできるし、中心がズレにくいということにもなります。<br>中心がズレたら広げる段階で少しずつ修正していきます。<br>面倒でも徐々に広げるほうが位置ずれがなく、綺麗に仕上がります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="450" height="336" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-26.jpg" alt="" class="wp-image-1736" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-26.jpg 450w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-26-300x224.jpg 300w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>
</div>


<p>さらに大きい穴はドリルでは開けることができないので、トリマー（下の画像）を使って手作業で広げていきます。<br>アルミなので割と簡単に広げることができます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="175" height="175" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-25.jpg" alt="" class="wp-image-1737" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-25.jpg 175w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-25-150x150.jpg 150w" sizes="auto, (max-width: 175px) 100vw, 175px" /></figure>
</div>


<p>慎重にやったつもりですが、やはりセンターがずれてしまっている所があります。このずれが穴あけのとき、そのままずれた状態で完成してしまいます。<br>大きい穴は多少位置の修正はできますが、小さい穴は最初のポンチの位置が非常に重要です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="369" height="277" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-24.jpg" alt="" class="wp-image-1738" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-24.jpg 369w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-24-300x225.jpg 300w" sizes="auto, (max-width: 369px) 100vw, 369px" /></figure>
</div>


<p>シールを貼った後、穴あけをしますが表面にバリが結構でています。シールの表面を傷つけないように、このバリを慎重に取っていきます。<br>機械で穴あけすれば綺麗になるのでしょうが、手作業ではやはりこんなになります。これで完成です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="700" height="271" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-23.jpg" alt="" class="wp-image-1739" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-23.jpg 700w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-23-300x116.jpg 300w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>
</div>


<p>裏面です。この面はバリを取るためにヤスリで思い切り削っているので傷がいっぱいできていますが、裏面なので問題ないですね。<br>ナットを12個取り付けています。ここに基盤を取り付けます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="198" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-22.jpg" alt="" class="wp-image-1740" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-22.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-22-300x119.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>この後、基盤に部品を配置して、部品とアルミのパネルに穴がピッタリ合う予定で作業を行いますが、手作業でやるのはかなり難しいです。ピッタリ合いません。</p>



<h2 class="wp-block-heading"><strong>基盤の作成</strong></h2>



<p>基盤の作成作業に入ります。９５ｘ７２ｍｍの秋月のユニバーサル基板（1枚120円）です。<br>こういう配置にします。左右の基盤は少し下の位置にずらして作成しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="567" height="224" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-21.jpg" alt="" class="wp-image-1741" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-21.jpg 567w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-21-300x119.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
</div>


<p>ハンダを乗せる面です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="567" height="234" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-20.jpg" alt="" class="wp-image-1742" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-20.jpg 567w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-20-300x124.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
</div>


<p>部品を仮配置してみる。（別のパネルの例です）</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="567" height="166" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-19.jpg" alt="" class="wp-image-1743" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-19.jpg 567w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-19-300x88.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
</div>


<p>この基盤に部品を配置していくわけですが、最初から綿密に位置関係を定義する必要があります。<br>アルミの穴あけとこの部品の位置がピッタリ合わないと穴の位置を広げたり、部品の位置を移動したり大変な苦労と時間のロスになり、何より仕上げが汚くなってしまいます。<br>そこで下のプリントのように基盤と同じ状態をPCで作成します。そして基盤の穴とプリントを透かしてみて穴がピッタリ合っているかをまず確認してから、そのデータを使用して、部品の配置をPC上でシミュレ−ションします。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="567" height="388" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-18.jpg" alt="" class="wp-image-1744" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-18.jpg 567w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-18-300x205.jpg 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
</div>


<p>アルミ板の裏面で、ネジとナットをはめて3つの基盤を実際の位置に置いて配置します。<br>位置が決まったら、ナットを瞬間接着剤で仮止めします。ナットとアルミ板の接着面は引っかき傷を付けて接着しやすいようにすると少し強力になります。<br>最初は仮止めなので接着剤は少しでいいです。<br>その時、ネジとナットが綺麗に垂直に無理なくハマるか確認をしてください。ナットの位置がずれるとネジを無理やりはめ込む状態になりナットが剥がれるやすくなします。<br>その後、瞬間接着剤が乾いたらネジを外して配置したナットだけにします。<br>その後は、エポキシのA液、B液、2液の混合タイプの強力接着剤を使ってアルミ板にナットをしっかり貼り付けます。<br>この接着は時間がかかるので作業を止める最後にするといいと思います。翌日にはしっかり固まっています。</p>



<p>2液混合タイプの強力接着剤を付けてナットを固定したところです。ナットの廻りにベッタリと塗って付けています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="333" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-17.jpg" alt="" class="wp-image-1745" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-17.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-17-300x200.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>以下の画像はナットの下のアルミ板を削っていない状態で2液混合タイプの強力接着剤で取り付けていますが、この状態ではネジを少し無理して回したりすると外れてしまいました。<br>ヤスリで削って接着剤がアルミ板をしっかりつかめる状態にするとかなりしっかり接着できるようになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="332" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-16.jpg" alt="" class="wp-image-1746" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-16.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-16-300x199.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>セットしたところ。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="188" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-15.jpg" alt="" class="wp-image-1747" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-15.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-15-300x113.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>ナットは基盤を挟むように上下に入れると、基盤の高さを微妙に調整できるようになるので便利です。上のナットはネジが短い場合は外してもかまいません。<br>この状態でアルミ板に接着して取り付けたナットと連結するわけです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="349" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-14.jpg" alt="" class="wp-image-1748" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-14.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-14-300x209.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>仮にそれぞれのパーツを配置します。部品は後で外すので間違えないように基盤に穴の位置をマジックで印を付けていきます。<br>この時点でパネルの穴と合っているか確認します。</p>



<p>これはパネル正面から見て、左側のところですが全ての部品の配置と基板上の配線が終了したところです。<br>抵抗はLED用として付いています、スイッチ類はプルアップ抵抗が入っていないのでスッキリしています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="510" height="406" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-13.jpg" alt="" class="wp-image-1749" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-13.jpg 510w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-13-300x239.jpg 300w" sizes="auto, (max-width: 510px) 100vw, 510px" /></figure>
</div>


<p>上の基盤の裏面です。スイッチ類やLEDの基本的な配線は非常に簡単なのですが、配線コードを使ってやるとこんなに複雑になっています。<br>この配線コードの太さは基盤の穴に通るぐらいの細いコードがベストです。私は昔の使わなくなたコンピュータの接続コードを分解すると沢山の細いコードが束ねてあるのでそれを使いました。<br>本来なら自作の基盤をちゃんと作成してやれば非常にスッキリなるのはよくわかっていますが、裏表ピッタリ合う両面の基盤の作成、穴あけとやはりかなり敷居はたかいのです。<br>お金もこのユニバーサル基板の方が安くてできます。しかしいずれは挑戦してみたいですね。自作の基盤作成。</p>



<p>何回も言いますが、スイッチ類、LEDそれぞれのパーツがアルミのパネルの穴とピッタリ合う必要があります。基盤のどの穴に部品を配置するかコンピュータ上でしっかり図面を描いて、準備する必要があります。<br>適当に始めても絶対にうまくいきません。図面が全てです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="551" height="425" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-12.jpg" alt="" class="wp-image-1750" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-12.jpg 551w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-12-300x231.jpg 300w" sizes="auto, (max-width: 551px) 100vw, 551px" /></figure>
</div>


<p>このように基盤とアルミ板の穴をピッタリ合わせるのが非常に難しい、表面のシールを作成して、そのシールの穴位置とピッタリあっているのを確認しておく必要があります。基盤の穴位置は決まっているので、これがズレていたら表面のシールを作り直す必要があります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="550" height="266" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-11.jpg" alt="" class="wp-image-1751" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-11.jpg 550w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-11-300x145.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></figure>
</div>


<p>下図を見てください。本来なら上の構造がいいのでしょうが、手作業で穴をピッタリの位置に開けるのは非常に難しい。<br>そこで私が採用したのは下の構図です。穴の位置が多少ズレてもキャップで隠れるのでこれがいいと思ったのですが、隙間の問題で苦労しました。<br>カチッと音がするようにするには最低でも0.5mmくらいの隙間が必要なんですが、ギリギリなんです。キャップの底に少し厚めの両面テープを入れて隙間を確保しました。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="494" height="325" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-10.jpg" alt="" class="wp-image-1752" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-10.jpg 494w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-10-300x197.jpg 300w" sizes="auto, (max-width: 494px) 100vw, 494px" /></figure>
</div>


<p>タクトスイッチを基準にこのパネルと基盤の高さを決定しています。その高さは四隅にあるネジとナットで調整しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="550" height="425" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-9.jpg" alt="" class="wp-image-1753" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-9.jpg 550w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-9-300x232.jpg 300w" sizes="auto, (max-width: 550px) 100vw, 550px" /></figure>
</div>


<p>あとは中央基盤、と右側にくる基盤を同じように作成します。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="571" height="314" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-8.jpg" alt="" class="wp-image-1754" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-8.jpg 571w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-8-300x165.jpg 300w" sizes="auto, (max-width: 571px) 100vw, 571px" /></figure>
</div>


<p>中央基盤には別に作成したteensyと74HC595の基盤をコネクタで接続するためのピンソケットが上下に設置されています。<br>秋月の分割ロングピンソケット２ｘ４２（８４Ｐ）を使用しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="338" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-7.jpg" alt="" class="wp-image-1755" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-7.jpg 600w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-7-300x169.jpg 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>
</div>


<p>Teensyと繋ぐピンソケットです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="567" height="212" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-6.png" alt="" class="wp-image-1756" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-6.png 567w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-6-300x112.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
</div>


<p>LEDは、取り付けには問題なくかなり融通がきく部品です。ここではLEDにブランケットを取り付けると仕上がりが綺麗にカッコよくなると思って採用したのですが、チョット大げさなってしまい、スペースがなく圧迫感が出てしまいました、結論として必要ないかもと思っています。</p>



<p>これは完成品です。全てをセットし後はTeensyと繋ぐだけという状態です<br>3分割しているのは、適当なユニバーサル基板が無いということもありますが、メンテンスのことも考えています。1箇所の修正のとき全てを外さないで済むからです。それと、パーツの位置を全面にわたってピッタリ合わせるのは広くなればなるほど大変になるからです。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="571" height="250" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-5.jpg" alt="" class="wp-image-1757" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-5.jpg 571w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-5-300x131.jpg 300w" sizes="auto, (max-width: 571px) 100vw, 571px" /></figure>
</div>


<p>中国の基盤作成会社「seeed」、格安で作成した基盤です。この基盤が郵送されてきたときは、やはり興奮しました。<br>初めての自分で作った本格的な基盤、最初は基盤キットを使ってやる予定で購入して始めたのですが両面基板が必要というところで諦めました。<br>この基盤は基盤キット代よりも安くできたと思います。驚異の安さでした。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="571" height="430" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-4.jpg" alt="" class="wp-image-1758" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-4.jpg 571w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-4-300x226.jpg 300w" sizes="auto, (max-width: 571px) 100vw, 571px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="571" height="484" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-3.jpg" alt="" class="wp-image-1759" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-3.jpg 571w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-3-300x254.jpg 300w" sizes="auto, (max-width: 571px) 100vw, 571px" /></figure>
</div>


<p>ピンヘッダに接続線をハンダ付けしてピンソケットと繋いでいます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1000" height="455" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-2.jpg" alt="" class="wp-image-1760" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-2.jpg 1000w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-2-300x137.jpg 300w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-2-768x349.jpg 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></figure>
</div>


<p>パネルに基盤をセットしてタクトスイッチのキャップをかぶせ、小さいスイッチにもボタンをかぶせました。<br>最後にロータリーエンコーダのノブをセットして完成です。<br>多少ずれているところもありますが、かなり綺麗に仕上がりました。<br>上には7セグメントをセットしています。中央に今回作成したオートパイロットをセットしています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="333" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-1.jpg" alt="" class="wp-image-1761" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-1.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-1-300x200.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>今回アルミで作成した全体の構造です。この空きスペースにオートパイロットのパネルが入ることになります。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="500" height="398" src="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598.jpg" alt="" class="wp-image-1762" srcset="https://polo-web.com/wp-content/uploads/2025/03/post-id-1598.jpg 500w, https://polo-web.com/wp-content/uploads/2025/03/post-id-1598-300x239.jpg 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>
</div>


<p>後はArduinoを使ってプログラミンしたデータをTeensyボードにアップロードすればX-PlaneのB737-800のオートパイロット部分をコントロールできるようになります。完成です。</p>



<p>できれば１つのパネルで色んな機体をコントロールしたいと思うのですが、オートパイロットの部分は全て違います。１つの機体に１つのパネルということになります。大変な労力が必要になるので多くの人はこんな大変なものは作らないでしょうね。多分。自分で作った感想です。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
