PageSourceSearch

https://www.hmcircuit.jp/speedmater/index.html

html hmcircuit.jp collected 2026-10-07 14:22:51 UTC 17,678 bytes, 280 lines download raw bytes

1<!DOCTYPE html>
2
3<html>
4
5<head>
6
7<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 7-8
7
8<script async src="https://www.googletagmanager.com/gtag/js?id=
8G-5E1FV8BXHH
vendor: 12 bytes, line 8
8"></script>
9<script>
10  
vendor: 134 bytes, lines 10-14
10window.dataLayer = window.dataLayer || [];
11  function gtag(){dataLayer.push(arguments);}
12  gtag('js', new Date());
13
14  gtag('config', '
14G-5E1FV8BXHH
vendor: 4 bytes, line 14
14');
15</script>
15
16
17    <link rel="canonical" href="https://www.hmcircuit.jp/speedmater/index.html">
18	
19
20	<meta charset="utf-8">
21	<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
22	<meta http-equiv="Content-Style-Type" content="text/css">
23    <link rel="shortcut icon" href="favicon.ico" type="image/vnd.microsoft.icon">
24    <link rel="icon" href="favicon.ico" type="image/vnd.microsoft.icon">
25	<link rel="stylesheet" href="speed_css.css" type="text/css">
26	<title>自転車用アナログ指針式スピードメーター  ~マイコンを使ってクルマの電気式速度計をチャリに搭載~ - HMcircuit</title>
27</head>
28
29<body>
30
31<h1>自転車用アナログ指針式スピードメーター<br>~マイコンを使ってクルマの電気式速度計をチャリに搭載~</h1>
32	<img src = "kousa2.png" loading = "lazy" alt = "アナログ指針表示" class = "type_logo">
33<div class = "top">
34	自転車にカッコいい針のメーターを!<br>
35	小学生時代からの空想が、<br class = "sp">
36	mbedマイコンでついに実現!<br>
37</div>
38<br>
39こちらは「交差コイル式」のクルマ用電気式メーターとマイコンを使用するバージョンです。<br>
40<a href = "fvcon.html">バイクの初期型電気式メーター(高角可動コイル式)を転用するだけの簡単(マイコンなし)なバージョンはこちら</a>
41
42	<h2>
43		ご紹介する回路には、<br class = "sp">
44		以下の3つの特徴があります。
45	</h2>
46
47	<img src = "gaiyo_1.png" loading = "lazy" alt = "アナログ指針表示" class = "top_img">
48	<img src = "gaiyo_2.png" loading = "lazy" alt = "電気式(マイコン制御)" class = "top_img">
49	<img src = "gaiyo_3.png" loading = "lazy" alt = "乾電池・速度センサ不要" class = "top_img">
50	
51	<h2>
52		まずは実験成功時の動画をご覧ください!
53	</h2>
54	<div class = "youtube_youtube">
55		<div class = "youtube">
56			<iframe src="https://www.youtube.com/embed/RsYG2hRVaTU?rel=0" frameborder="0"></iframe>
57		</div>
58	</div>
59	
60	<h2>
61		<目次>
62	</h2>
63	<ul class = "link_menu">
64		<li><a href = "#a">ハードとソフト</a></li>
65		<li><a href = "#b">スピードセンサー不要の原理</a></li>
66		<li><a href = "#c">交差コイルメーターの入手及び使用法(工事中)</a></li>
67		<li><a href = "#d">車のメーターに元々ついている制御回路を使わない理由</a></li>
68	</ul>
69
70<section>
71	<h2>
72		<a id = "a"><ハードとソフト></a>
73	</h2>
74	本回路は、ダイナモから電源をとるのみならず、ダイナモの出力周波数は速度に比例することに着目しダイナモを速度センサとしても用いています。そのため、センサ不要、乾電池不要となりまります。<br>
75	マイコンでは、周波数カウンタおよび交差コイルメータードライブの処理をしています。周波数を計測し、計測結果を車の交差コイルメーターを駆動するためのsin・cos成分に分解し、PWMで駆動します。
76	<p style = "clear:both;">
77		<span class = "red">
77動画撮影時から改良を重ね、ドライブ回路や電源回路は大幅に変更されています。</span>
78	</p>
79	
80	<img src = "kairozu.png" loading = "lazy" alt ="回路図" class = "kakoi">
81	
82
83	ソフトウエアは「直接計数式(ゲート方式)周波数カウンタ」を用いています。ゲート方式とは、一定時間に何回パルスが来るか数える方式です。(ちなみに周期をタイマーで測るモードはレシプロカル方式と言います。)<br>
84	LPC1114にはFPU(浮動小数点演算ユニット)が搭載されていないため、レシプロカル方式のアルゴリズムでは処理が追いつかず実用になりませんでした。<br>
85	また、FPUがないため当然sin・cosの計算等にも時間がかかる為、フラグを立てて計算をする時と測定に専念する時に処理を分けています。
86	<br>
87	開発環境には <a href = "https://mbed.org/" target = "blank">mbed</a> を使用しC言語で記述しています。<br>
88	
89	<br>
90	
91	<label for="Panel1">ソースコード 表示/非表示</label><input type="checkbox" id="Panel1" class="ExpandCheckBox" />	
92	<p class = "code">
93		//LPC1114 チャリスピードメーター
94		//ゲート方式 一定間隔内のゼロクロスを数える<br>
95		//平均化処理しないと針がふらつく<br>
96		<br>
97		#include "mbed.h"<br>
98		#define f_rad_keisuu 0.03  //パルス周波数からradへの変換係数 ハブダイナモ = 0.03? ブロックダイナモ=0.004<br>
99		#define kakudo_max 4.4  //メーターの最大振り角度(rad)<br>
100		#define sampling_time 0.1 //サンプリング周期(秒) 0.05だと処理落ち、0.15だとガクガク 0.1がいい感じ<br>
101		<br>
102		<br>
103		//内蔵LED<br>
104		DigitalOut myled1(dp14);<br>
105		DigitalOut myled2(dp28);<br>
106		 <br>
107		//信号入力<br>
108		InterruptIn speed_sensor(dp26);   //スピードセンサーからの車速パルス入力<br>
109		 <br>
110		//制御出力<br>
111		PwmOut sin_coil(dp1);   //sinコイル出力<br>
112		PwmOut cos_coil(dp2);   //cosコイル出力<br>
113		 <br>
114		//サンプリングゲートタイマー設定<br>
115		Ticker sampling;       //サンプリング用タイマ割り込み<br>
116		 <br>
117		//グローバル変数<br>
118		int pulse;      //パルスをカウントする変数<br>
119		int gate;   //ゲートフラグ(0:計算中 1:計測中 2:計測準備完了)<br>
120		int data[10] = {0,0,0,0,0,0,0,0,0,0};<br>
121		 <br>
122		//角度を受け取って交差コイルにPWM出力する関数。pwmoutは0~1のため、0.5を中心にする。<br>
123		void kousa_coil_output(float kakudo)<br>
124		{<br>
125		&nbsp;myled2 = 0;<br>
126		&nbsp;if(0 <= kakudo && kakudo <= kakudo_max)    //範囲内ならば交差コイルドライブ<br>
127		&nbsp;{<br>
128		&nbsp;&nbsp;		sin_coil = 0.5 + 0.5 * sin(kakudo);<br>
129		&nbsp;&nbsp;		cos_coil = 0.5 + 0.5 * cos(kakudo);<br>
130		&nbsp;}<br>
131		&nbsp;else    //範囲外ならオーバーロードランプを付けメーターの更新をしない<br>
132		&nbsp;{<br>
133		&nbsp;&nbsp;		myled2 = 1;<br>
134		&nbsp;}<br>
135		&nbsp;gate = 2;   //振れ角の計算まで終わったら次の測定準備完了<br>
136		}<br>
137		 <br>
138		void pulse_counter(void)<br>
139		{<br>
140		&nbsp;pulse ++;   //一回呼ばれる毎にパルス数変数をカウントアップするだけ<br>
141		}<br>
142		 <br> 
143		 <br>
144		//パルス数からスピードを計算する関数(タイマ割り込みで呼ばれる)<br>
145		void speed_calc(void)<br>
146		{<br>
147		&nbsp;static float output = 0.0;<br>
148		<br>
149		&nbsp;if(gate == 1){<br>
150		&nbsp;&nbsp;		gate = 0;<br>
151		&nbsp;&nbsp;		data[0] = data[1];<br>
152		&nbsp;&nbsp;		data[1] = data[2];<br>
153		&nbsp;&nbsp;		data[2] = data[3];<br>
154		&nbsp;&nbsp;		data[3] = data[4];<br>
155		&nbsp;&nbsp;		data[4] = data[5];<br>
156		&nbsp;&nbsp;		data[5] = data[6];<br>
157		&nbsp;&nbsp;		data[6] = data[7];<br>
158		&nbsp;&nbsp;		data[7] = data[8];<br>
159		&nbsp;&nbsp;		data[8] = data[9];<br>
160		&nbsp;&nbsp;		data[9] =  pulse;<br>
161				<br>
162		&nbsp;&nbsp;		output = (data[0]+data[1]+data[2]+data[3]+data[4]+data[5]+data[6]+data[7]+data[8]+data[9]) * f_rad_keisuu;	<br>&nbsp;&nbsp;		//10回平均後に係数をかけてメーターの振れ角度に計算
163		 <br><br>
164		&nbsp;&nbsp;		kousa_coil_output(output);//交差コイルドライブ関数に角度(rad)を出力<br>
165		&nbsp;}<br>
166		&nbsp;if(gate == 2)<br>
167		&nbsp;{<br>
168		&nbsp;&nbsp;		pulse = 0;<br>
169		&nbsp;&nbsp;		gate = 1;<br>
170		&nbsp;}<br>
171		}<br>
172		 <br>
173		int main() {<br>
174		&nbsp;sin_coil.period_us(1000.0);//pwmは1kHz<br>
175		&nbsp;cos_coil.period_us(1000.0);//pwmは1kHz<br>
176		&nbsp;speed_sensor.fall(&pulse_counter);//立下りピン変化割り込みでパルスカウンターを呼ぶように設定<br>
177		&nbsp;sampling.attach(&speed_calc , sampling_time);//タイマ割り込みで速度計算関数を呼ぶ<br>
178		&nbsp;myled1 = 1;//ledをつけて準備完了<br>
179		&nbsp;gate = 2;//測定準備モードにセット<br>
180		&nbsp;while(1) {<br>
181		&nbsp;}<br>
182		}<br>
183	</p>
184
185</section>
186
187<section>
188
189	<h2>
190		<a id = "b"><スピードセンサー不要の原理></a>
191	</h2>
192	このメーターの特徴の一つとしてライト用ダイナモをセンサー代わりに使用することで、スピードセンサーが不要であることがあります。その原理を説明します。<br>
192図に、ライト用ダイナモの原理図を示します。<br>
193	<img src = "gene.png" loading = "lazy" alt = "ライト用ダイナモの模式図" class = "naibu_img">
194	自転車のライト用ダイナモは、発電機の世界では「永久磁石式交流同期発電機」という仲間に入ります。これは、永久磁石をコイルの前で回転させて、コイルに誘導起電力を起こす発電機です。コイルの前をS極、N極が交互に通過しますが、整流子を持たないため出力は交流となります。<br>
195	自転車のスピードを上げるとライトが明るくなることから発電機の回転数と電圧に関係があることは誰でも体験的に知っていますが、実は発電周波数と回転数にも関係があります。自転車ダイナモでは、電気角(発電出力の角周波数)と、機械角(ダイナモを機械的に回転させる角速度、つまり回転数)が一対一に対応、つまり同期します。それがライト用ダイナモが「同期発電機」の仲間に入る理由です。<br>
196	つまり<span class = "red">ライト用ダイナモの発電周波数を測定すると自転車のスピードが分かる!</span>ということになります。<br>
197	マイコンで発電機の周波数を測定し、交差コイルメーターをドライブすることでスピードメーターを実現しています。わかりやすく言ってしまえば、周波数カウンタの表示部をアナログ指針表示にしただけです。
198	<br><br>メーターの電源もライト用ダイナモからとりますので乾電池も不要です。ダイナモが電源兼スピードセンサーとなっています。<br>
199	ダイナモからの電源の取り出しについては、<a href = "../charihatsu12v/charihatsu12v.htm" target = "blank">こちらをご覧ください。</a><br>※リンク先の自転車発電の記事では倍電圧整流を使用していますが、鉛蓄電池を併用しない場合は高速走行時にOPアンプが過電圧で壊れますので、冒頭の動画のようにブリッジ整流としてください。
200
201</section>
202
203<section>
204	
205	<h2>
206		<a id = "c"><交差コイルメーターの入手及び使用法></a>
207	</h2>
208
209	<p>
210		<img src = "example1.jpg" loading = "lazy" alt = "メーターの例" class = "naibu_img">
211		<br>さて、このメーターはどちらのメーターが使用できるでしょうか?
212	</p>
213	<p>
214		<img src = "kousa.jpg" loading = "lazy" alt = "交差コイルメーターの例" class = "naibu_img">
215		<br>まず、交差コイルメーターとは直角に交差するコイルの中に針を取り付けた棒磁石を設置したメーターで、車・バイクの電気式メーターに使われています。<br>それぞれのコイルに指針を振らせたい角度の正弦・余弦の電流を流すと、振らせたい角度方向の磁界ベクトルが発生します。その時、3平方の定理とsin^2+cos^2=1より、合成磁界ベクトルの大きさは変わらないため、棒磁石を目的の方向を向かせることができます。<br>
216		構造としては2相の交流同期電動機と同じ形をしていますので、どちらかというとメーターというよりモーターの仲間に入ります。
217	</p>
218	<p>
219		<img src = "example2.jpg" loading = "lazy" alt = "メーターの例" class = "naibu_img">
220		<br>これを入手するにはオークションもしくは自動車リサイクル工場で車の電気式メーターを買えばよいのですが、いくつか注意点があります。<span class ="red">電気子でも必ずしも使用できるわけではありません</span>。<br>
221		<br>まず、アラゴの円盤を用いた<span class = "red">使えない機械式スピードメーターは、写真のように後ろに大きなカップリングが出ています</span>ので見間違えることはないと思いますが、ステッピングモーターを使用したメーターはパッと見ã
221§ã¯åŒºåˆ¥ãŒã¤ã‹ãªã„ため間違て購入してしまったら残念でしたということになります。<br>
222		ステッピングモーターを避けるには、90年代後半~00年代前半のメーターを狙うと良いでしょう。<br><br>ちなみに写真のタコメーターは交差コイル式でした。
223	</p>
224	<p>		
225		最も紛らわしいタイプは2相ステッピングモーターを使用したタイプで、交差コイルと同じ4端子のアクチュエーターのため区別がつきません。外車のメーターに使われていることがあります。私はアウディのメーターで見事に外れを引いてしまいました・・・<br>2相ステッピングモーターは構造が交差コイルですので、間違って買ってしまった場合はギアを取っ払って針をモーターに直接取り付ける改造を施すしかありません。<br>
226		<span class = "small">※3相以上のステッピングモーター方式メーターを間違って買ってしまった場合は、マイコンに制御プログラムを書けば降らせることはできます。ステッピングモーターのドライブプログラムについては、ロボット工作系サイトが詳しいのでそちらを検索してください。</span>
227	</p>
228	<p>
229		
230			<img src = "example3.jpg" loading = "lazy" alt = "タウンエースノアの交差コイル" class = "naibu_img"><br>参考として、<span class = "red">選択肢は狭まりますが確実性を求めるならば、「”針のシャフトを取り囲むようにきれいに並んだ4本のネジ”でメーターアクチュエータに配線されている、見るからに交差コイル」というのを選べば外れが少なくなります。</span><br>針を取り囲んでいてもきれいに並んでいないネジや3本の場合は車速信号や電源を内部基板へ送って駆動するタイプですので、ステッピングを引く可能性が多少ありますが、年代的に古いものならばほぼ大丈夫でã
230—ょう。
231		<br>
232		例えば写真のタウンエースノアのメーターはタコメータ・スピードメーターともに交差コイルです。
233		
234	</p>
235
236</section>
237
238<section>
239	
240	<h2>
241		<a id = "d"><車のメーターに元々ついている制御回路を使わない理由></a>
242	</h2>
243	車のメーターを触ったことがある方でしたら、車のメーターは車速パルス信号を得て交差コイルをドライブしているため、ダイナモ出力を波形整形してそのまま入れればよいのでは?という疑問がわくと思います。私も初めはその方法を考えました。しかし、実験してみるとどうも都合が悪いのです。<br>
244	<ul>
245		<li>パラメーターが自由にいじれません。専用ICですので当然ですが・・・。ブロックダイナモですとすぐ振り切ります。</li>
246		<li>消費電力が大きすぎます。燃料計など余計なところに消費される電流は、ダイナモという限られた電源の中では非常に問題になります。</li>
247		<li>安定した12Vを供給しないと動きません。つまり蓄電池必須になります。</li>
248		<li>柔軟性に欠けます。電圧計にしたい、電流計にしたい、おしゃれな演出を入れたい・・・などの要求は当然満たせません。</li>
249	</ul>
250	以上のような理由から、マイコンで制御プログラムを書いてしまったほうが楽という結論に至りました。<br>
251
252</section>
253	<!--
254	<h2>
255		<ハードウエアの解説>
256	</h2>
257	<div class = "red">工事中</div>
258	<h2>
259		<FPUのないマイコンでの格闘記>
260	</h2>
261	<div class = "red">工事中</div>
262	<h2>
263		<電源の工夫>
264	</h2>
265	<div class = "red">工事中</div>
266	-->
267
268<br style = "clar:both;">
269
270<div class = "footer">
271	ご覧いただきありがとうございました!
272	<br>当ページのコンテンツは非商用の場合は連絡不要で自由にご利用頂けます。不具合を発見された場合はご連絡頂けると助かります。
273	<br>その他回路に対するご意見や、お問い合わせも<address>mailあっとmail.hmcircuit.jp</address>までお願いいたします。
274	<br>※必ず件名に「スピードメーター」等のわかりやすい単語を入れてください。「件名なし」や「こんにちは」などはスパムフォルダへ振り分けられてしまいます。
275	<br><br><a href = "https://www.hmcircuit.jp">トップ</a>   <a href="https://www.hmcircuit.jp/privacy_policy.html">プライバシーポリシー</a><br><br>
276</div>
277
278</body>
279
280</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.