ナレーションに「ゆっくり」ではない最近の合成音声を使ってみました。短い動画なのにナレーション入れるの地味に大変。毎週のようにアップしているYouTuberはいつ寝ているの?
2026年5月27日水曜日
非接触スイッチ使ったキッチンの手元灯製作記録【動画】
ナレーションに「ゆっくり」ではない最近の合成音声を使ってみました。短い動画なのにナレーション入れるの地味に大変。毎週のようにアップしているYouTuberはいつ寝ているの?
2026年5月24日日曜日
配電盤カバーのレストア
配電盤のブレーカと漏電遮断器のカバーが経年劣化で壊れて外れてしまった。元々契約アンペア数を変更したときにテキトウにカバーを加工されたため割れていたのを接着剤でくっ付けて騙しだまし使っていたもの。
2026年5月23日土曜日
いざ鎌倉!
工作記事が途切れていて恐縮ですが、昨日は休みをとって鎌倉へでかけてきました。時々小雨が降ったりして少し肌寒いくらいでしたが、少し前のような夏の暑さではなくよかったです。
海外からアクセスしてくれている皆さんへ、AIによる鎌倉の紹介。
------------------------------------------------
鎌倉は、12世紀末に源頼朝が幕府を開いた神奈川県の都市で、京都と並ぶ代表的な「古都」です。三方を山に、南を海に囲まれた自然の要塞であり、武家政権の拠点として栄えました。現在は東京都心から約1時間のアクセスで、多くの観光客が訪れる人気の歴史・文化都市です。
- 武家の都: 12世紀末(鎌倉時代)、京都の公家政治に対抗して日本初の本格的な武家政権が誕生した街です。
- 独自の文化: 鎌倉五山に代表される禅宗文化や、鶴岡八幡宮、高徳院の大仏など、800年の歴史を持つ寺社や文化遺産が多く残されています。
------------------------------------------------
今日は土曜日ということもあって日本人も多く、インバウンドの外国人は半数くらい。小町通りは原宿と同じような感じで混雑していて、外国人率が少し高いような感じ。人混みがすごくて歩きずらいのですぐに鳥居のある散策路に戻りました。
写真は本殿への長い階段。たまたま人が少ない写真が撮れた。このあと蓮池で餌を求める大量の鯉や鳩を眺めてぼーっと過ごす。
2026年5月17日日曜日
断捨離は続くけどお宝は見つからない
東京都心で今年初めての真夏日を記録したようですね。午前中は久しぶりに町田の市街地に出かけたのですが 、すでに暑かった。
主目的ではなかったのですが、プラバンが欲しくて久しぶりにハンズに寄ったらマテリアルや工具などはなくなっていて、少しおしゃれな雑貨の店といった感じ。ハンズはカインズに買収されたのでカインズとの棲み分けか? それではと、ジョルナという若い子向けのファッションビルの地下にあって以前はプラモやミニ四駆、工作材料を売っていた店に行ったら、すでに無くなっていて、トレーディングカード屋になっていた。最後に世界堂という画材屋さんに向かったら、そこも無くなっていた。手を動かして何か作ろうという人は減ってきているんだろうね。ただ、まだユザワヤは残っている模様。
さて昨日、TOFセンサがステンレスシンクに反射してLED照明が勝手にオンオフした問題は一応解決しました。LED照明を一旦取り外して内部のTOFセンサを水平ではなく、若干傾きをつけて斜めに取り付け。これによりステンレスシンクでの反射光がセンサに届かなくなったはず。再びキッチンに取り付けましたが誤反応はありません。
ところでGWからのかみさんの探し物はまだ見つかりません。色々な場所を探すついでにパソコン関係の断捨離も進めています。今回発掘されたのは、各種ストレージと大量のケーブル類。
右下は、SDカードの親玉のような薄くて大きなメモリカード64MB、なんという名前だろう? 昔のトイカメラに入っていた。これ以外はノートパソコンのPCカードスロットに挿すストレージ。左上は1.8インチHDD 5GB、そのとなりは10MBのストレージ、右端は3.5インチHDD(容量不明)。下はコンパクトフラッシュを挿したPCカード。
前回お宝が発掘されて思い出したのですが、どこかに純金名刺もあるはず。その昔、仕事で田中貴金属さんの工場に伺ったときに頂いたものなので由緒正しい本物のはず。何も知らなかったのですが、普通に名刺交換して、会議を行い、退去する際に純金の名刺になったものをお土産として頂きました。
長らく忘れていたのですが、4~5年前に片づけをしていたときに見つけ、大事だから仕舞っておいたのですが、仕舞い場所を完全に忘れた。断捨離ついでに探しているけど見つからない。何かに紛れて捨ててしまった恐れもある。
純金名刺は金が0.5gか1gらしいので、今の価格だと13,000円か26,000円の価値があります。一時期3万円/g近いこともあった。
ということで、探し物と断捨離はまだしばらく続きそう。
2026年5月16日土曜日
TOFセンサ照明に伏兵あり
先週取り付けたTOFセンサにより非接触でオンオフできるLED照明ですが、思わぬ伏兵がいました。まぁ思いもよらないから伏兵なんですが。
それは炊飯器の「湯気」です。TOFセンサの真下ではないのですがキッチンカウンタには炊飯器が置いてあり、ご飯が炊けて炊飯器から湯気が出始めると、照明が勝手にオンオフを繰り返します。夕方気付きましたが朝もそうだと思う。センサのレーザ光が湯気に反射して認識している模様。
という訳で、照明の左右を入れ替えてTOFセンサを左側に持ってきました。また、少し手前に取り付けて手を奥まで伸ばさなくて済むように少し改善。かみさんから届きにくいという声があったので。照明の取り付け方の変更は簡単でしたが、棚の中に隠れている電気配線を見直すのに少し苦戦。
2026年5月9日土曜日
TOFセンサ近接スイッチ組み込みLED照明の取り付け
連休も残すところ後1日、12連休も過ぎてみればあっと言う間でした。 そんな中ようやく、TOFセンサ近接スイッチでオンオフするLED照明 をキッチンに取り付けました。
シンクの上にある棚の底面に付いていた古い蛍光灯照明を外すと、少し日焼けしたような感じだったので棚の底面や側面を塗装をし直すところから開始。写真はまだマスキングテープが貼ってあります。
点灯中。今までの蛍光灯よりかなり明るくて、iPhoneの絞り機能が効いて窓の外が暗く映っています。
- TOFセンサ近接スイッチでオンオフするLED照明(完成) 2026年3月28日 【回路図とソース】
- TOFセンサを使った非接触スイッチ、電源トラブル 2026年3月7日
- TOFセンサによる近接スイッチ WDT実装他 2026年3月4日
- TOFセンサによる近接スイッチのユニバーサル基板実装 2026年3月1日
- TOFセンサによる近接スイッチを照明機器へ組み込む検討 2026年2月28日
- TOFセンサとPICで作った近接スイッチプロトタイプ(動画) 2026年2月22日
- TOFセンサをPIC12F629で使う(動いた) 2026年2月20日
- TOFセンサをPIC12F629で使う(使えてない) 2026年2月15日
- PICプログラムをchatGPTに書いてもらったけど、、、 2026年2月14日
- TOFセンサ(測距センサ)を試してみた 2026年1月31日
2026年5月7日木曜日
アンソロピックのAIに驚きの日々
最近、アンソロピックのAI、Mythos(ミトス? ミュトス?)が話題です。性能が高すぎてセキュリティの穴を見つけてサイバー攻撃に悪用されてしまう恐れがあるという。日本でも片山財務大臣が官民で危機感を共有したというニュースがあった。
個人的にこの4月から職場でアンソロピックのClaude(クロード)を使ったプログラム開発を始めていて、その強力さを実感していたので肌感覚としてこの危機感を感じた。とにかくすごい(語彙w)。ソフト開発やサービス会社の株価が落ちたSaaSの死や、大規模なレイオフも頷ける。
仕事でやっていることは、俗にいうバイブコーディング(Vibe Coding)です。Vibe(雰囲気)でAIに指示してコードを書くという開発スタイル。ちなみに職場ではソフトやサービスを販売するわけではなく、自分たちの目的達成や効率化のために分析、機械学習、可視化などを行うプログラムを作って使っている。
このバイブコーディングが凄くて、毎日圧倒されています。OpenAIやGeminiのようにブラウザやGUIアプリで使うのではなく、ローカルPC上のコマンドラインからAIに指示を出す Claude CLI というもの。
作業用のディレクトリに、作って欲しい内容などの指示を記載したドキュメント(日本語OK)、入出力となるデータのフォーマットサンプル、テスト用のデータなど必要なものを一式を揃えて実行させる。すると指示を理解し、自動的にコードを生成し、勝手にテストを行って、問題があれば直していく。途中、判断を求められることもあるが、基本的には自動で進む。一度、テストデータ数が膨大だったことがあり、「時間がかかるので数百点をサンプリングします」と言ってきたときは感動した。
過去のプログラムコードを読ませてドキュメントを生成したり、そのコードを元に新たに作ったり、処理のアルゴリズムや手法など著名な論文のものを使って欲しいと指示すると探してきてそれを採用する。処理の結果を見て改善の指示を出すとすぐに直してくれ、改善を繰り返した結果の最終的なドキュメントもだせる。まるで有能なスタッフができたような感じ。これが私の契約タイプで110ドル/月(1万7~8千円)。1日分の人件費程度ですぐにペイできる。コードだけを書くプログラマはいらなくなる感じ。
ただ、色々やってくれるのが面白く、改善の繰り返しになって時間が溶ける。柱となる方針はこちらがしっかりと持っていないと細かい改善の繰り返しに陥ってしまう。
という訳で、個人的にPICのアセンブラでコードを書くのが好きという変態的な楽しみは廃れていく世の中です。すでに廃れているか?!
2026年5月4日月曜日
レゴ洗い
探し物が見つからず断捨離づいた かみさんから次々を指示がきて今日はレゴ洗い。工作やDIYネタはしばらくお休みで恐縮です。
桶にお湯とマジックリンを入れて少しの時間浸けてから、歯ブラシで目立つ汚れを落とします。ブロックの凸部や凹部は竹串で汚れを落としました。それでも中々落ちない汚れもあって、とくに白や黄のレゴは汚れが目立つので最終的に超音波洗浄機にかけました。ジュエリや腕時計を洗う小型の洗浄機なので、少しずつ何度もくり返します。
写真は全体の半分くらい。大物ブロックは別に洗いました。中腰で作業していたので腰にきた。
2026年5月1日金曜日
連休3日目、断捨離してたらお宝発掘
連休3日目のはずでしたが急用ができて激しい雨の中、1時間だけ出勤しました。帰宅したら靴の中までびしょ濡れ。
帰宅後、かみさんが探し物が見つからないというので、二人してリビングのキャビネットの中身をすべて取り出して捜索。せっかくの機会なので断捨離を実行。書類とフォルダが殆どで、すでに不要なものが多数。昔の保険証書や保険金請求書、領収書や確定申告書、クレカの明細書(昔は紙が送られてきていた)、年賀状、古い手帳、その他諸々。電子工作の部品やHDD、様々なケーブル類、ガラケーの充電アダプタなどもでてきた。
書類には住所や氏名が書かれているものが多いのでシュレッダ処理が必須。家庭用シュレッダなので、一度に3枚くらいしか処理できない。年賀状は1枚が限界。仕様上は8枚までとなっているが、オイル切れで刃の摩擦が大きくなっている模様。切れないと自動的に逆回転が始まるが反応がイマイチで遅い。
とにかく書類の要不要の判断が大変なのと、シュレッダ作業に時間がかかり半日仕事。もっと頻繁に見直しをすべきと痛感しました。結局、探し物は見つからず、明日から家中捜索することになった。
シュレッダゴミが3杯分(まだシュレッダの中に残っているので4杯でた)になりました。後ろに写っているのがキャビネット、ガラス扉ですがリビングで中身が見えるのがいやなので内側に障子紙が貼ってあります。
そんな書類に挟まれた中に銀行の封筒が見つかりました。中身を確認すると福沢諭吉3枚、3万円。ラッキー!ですが、どうしてここにあるのか思い出せません。お年玉用に用意したものか、それにしてはピン札ではなかった。何かの支払い用に用意していて忘れたのか、手間賃か何かで頂いたものか? とにかく気付かずに捨てたりシュレッダにかけなくてよかった。断捨離の神様がご褒美にくれたということにしてかみさんと山分けしました。
断捨離中に 見守りセンサ からLINEメッセージが届きました。稼働していることを示す月一の定期連絡です。ちゃんと動いてはいるようですが、普段立ち入らない部屋に置いてあるのでもっと頻繁に安否確認メッセージが届いてよいはず。
朝から出勤し、帰宅後は断捨離し、午後からは平日しか行けない金融機関に行ったりしてHPが削られたので、見守りセンサのプログラム確認は後日とします。
2026年4月30日木曜日
1万円の超音波カッターを試す(動画)
12連休の2日目ですが、もう2日も経って残り10日か、と思うとあっという間に過ぎ去りそう。昨日今日は天気がイマイチですが、涼しいので草むしりや剪定などを行ってます。雑草の伸び方がヤバい。
前回書いた1万円の超音波カッター を実際に使ってみました。インターバルタイマ に使っているタカチのケースへの穴開けです。とても楽に切れていい感じ。ただ、溶けた樹脂が盛り上がるので寸法ギリギリは狙えない。少しマージンをみて最後はヤスリやアートナイフで整えた方がよい。
動画(2分半)を撮りましたが、刃先にピントが合わず加齢の進んだ手ばかりよく映っています(^_^;
さらに庭木の剪定もまだ残っているし、越冬のためにリビングに避難していた観葉植物を外に出すのと、伸びすぎた枝を切って挿し木にしたい。また、高圧洗浄機ケルヒャーで掃除したいところもある。
そんなこんなの連休になりそう。
2026年4月25日土曜日
1万円の超音波カッター
今日は久しぶりの休日出勤、明日も出勤。その代わり30日、1日に代休とって、さらに5月7日、8日に年次休暇で、4 月29日から5月10日まで怒涛の12連休。途中帰省するけどあとはノープラン。溜まっている工作を何とかしたい。
さて、いつものようにアリエクを彷徨っていたら、1万円弱で購入できる超音波カッターがあったのでポチってみた。昨日届いていたけど開ける暇がなく、先ほど開封。格好いい化粧箱に入っています。型名はFS-S1 Ultrasonic Cutting Knife というもの。昔の超音波カッターと比べるとよい感じのデザイン。USB-TypeC PD 15Vで動作。
2026年4月22日水曜日
1,000記事目の記念にブログ概要
本ブログの記事が丁度1,000となりました。記念してGeminiに本ブログの概要とイラストを作ってもらいました。ちょっと最近の記事に引っ張られているところがありますね。
◆
「PIC電子工作ブログ(
【全体的な概要と変遷】 このブログの最大の特徴は、単なる完成品の紹介にとどまらず、回路設計からプログラミング、ケース加工、そして直面したトラブルの解決策までを詳細に綴る「試行錯誤のプロセス」にあります。
過去から続く中心テーマ:電子工作とPICマイコン タイトルの通り、Microchip社のPICマイコンを用いた工作が活動の原点です。過去の記事では、LEDの点灯制御といった基礎から始まり、徐々に実用的なデバイスの製作へと進化してきました。特に、センサー類(TOF距離センサー、温度センサー、人感センサー等)の活用や、ユニバーサル基板・自作プリント基板を用いた実装など、ハードウェアに近いレイヤーでの工作が丁寧に行われています。
近年の動向:IoT化と実用性の向上 近年の記事では、単体の電子機器製作から、Wi-Fiモジュール(ESP32等)を組み合わせた「IoTデバイス」への展開が目立ちます。具体例としては、LINEへの通知機能を備えた「見守りセンサ」の開発が挙げられます。これは、日常生活の中での実用性を重視したプロジェクトであり、プログラムのバグ修正や長期間の動作試験の様子が克明に記されています。
ライフスタイルと雑記 工作以外にも、ブログ運営に関するデータ(海外からのアクセス急増への驚きなど)や、旅行(軍艦島上陸のリベンジなど)、花粉症の悩みといった日常の出来事も綴られています。これにより、技術ブログでありながらも運営者の人柄が伝わる親しみやすい構成となっています。
【まとめ】 総じて、長年の経験に裏打ちされた確かな技術力と、新しい技術(LINE連携や最新センサー)を取り入れる柔軟さを併せ持ったブログです。趣味の電子工作を楽しむ読者にとって、トラブルへの対処法や製作のヒントが詰まった貴重なアーカイブとなっています。現在は、実用的な見守りデバイスの完成度を高めるなど、より生活に密着した技術活用を精力的に発信しています。
◆
工作は遅々として進まなかったり、雑記が多かったりしますが、よろしければ引き続きアクセスして頂ければ幸いです。
最近動画がアップ出来てませんが、https://www.youtube.com/@pic もよろしく。
2026年4月19日日曜日
長崎・軍艦島上陸リベンジ
2026年4月12日日曜日
アメリカからのアクセス急増は継続中
2026年4月5日日曜日
見守りセンサは保留、休養日
写真の風景について
満開の桜(ソメイヨシノでしょうか)と、うっすらとした青空を背景にしたひつじ雲のコントラストがとても綺麗ですね。高積雲は太陽の光を通しにくいため、このように少し落ち着いた色味の空模様を作り出します。
今のところはまだ日差しが届いていますが、もしこの雲が厚くなってきたら、傘の準備を考えておくと安心かもしれません。
2026年4月1日水曜日
LINEに通知する見守りセンサ、最終テスト継続中
日曜日から開始したLINE見守りセンサは、普段使っていない部屋に置いてあり、見守り継続中です。昨日はその部屋に入るのが遅れてしまい、15時間無反応が検出されてしまいました。うまく動いていることが確認できたのでOKです。
今日は、毎月1日の12:00に見守り継続中であることを知らせる通知機能が無事に動作して、メッセージが届きました。職場で昼休みに確認して小さくガッツポーズ。LINEのトーク画面に桜の花びらが舞っています。
あとは、外出(旅行)スイッチが押されたあと、帰宅反応があるまで見守りを保留する機能と、帰宅しなくても4日経過すると見守りが自動復帰する機能の確認をしていきます。自動復帰は4日後(24Hx4)にしていますが、自動復帰からさらに15時間反応がなかったときにメッセージが飛びます。計111時間後ですね。このあたりを確認し、一通りの検証が終わったらスケッチと回路図をアップするつもりです。
ちなみに、ESP32開発キットを使ったプロトタイプのスケッチは以下にあります。機能的にはほぼ同じ。
- LINEに通知する見守りセンサ(その2;プロトタイプ) (2025年8月24日)
早いところ仕上げないと1年がかりのプロジェクトになってしまう。
2026年3月29日日曜日
LINEに通知する見守りセンサの最終テスト開始
急に暖かくなってお花見日和でした。しかし相変わらず花粉症が酷いので、遠出は避けて近所で軽くお花見。
今朝、見守りセンサに最終プログラムを書き込み、テストしようとしたら動作中を示す緑色LEDが点灯しません。プログラムの不具合かと調べましたが明らかに光るはず。基板の裏からLED接続箇所をテスタで測ったら異常です。念のためLEDテスタで電圧をかけてみましたが点灯しません。ユニバーサル基板に繋いだのは新しいLEDだったと思うのですが、壊れていたようです。滅多にないです。
ということで朝からLEDを交換してようやく長時間のテスト開始。主に以下の内容を確認します。
- 15時間反応がないとLINEにメッセージが飛ぶ。15時間以内にセンサの前を横切るとカウンタをリセットする
- 外出(旅行)スイッチを押しても4日以上経過すると見守りを再開する。よって4日+15時間でメッセージが飛ぶ
- 毎月1日の12:00に見守り継続中である旨のメッセージが飛ぶ。
見守り開始時に飛んできたメッセージ。
2026年3月28日土曜日
TOFセンサ近接スイッチでオンオフするLED照明(完成)
TOFセンサを使った近接スイッチでLED照明のオンオフを行う工作もいよいよ大詰め。
先日届いた小型の電源モジュール にAC100Vを繋いで動作確認したら全然電圧がでません。壊れているのかと思い、もう1個調べても同じ。調べてみると購入したショップの商品説明には記載がなかったのですが、他のショップの説明欄を見ると、外付けに耐圧の大きなコンデンサ(物理的にも大きくなる)が必要なことが判りました。これでは小さく作れません。トホホです。
諦めて当初の計画通りトランスレス電源で行くことにしました。TOFセンサが発光するタイミングで電位が下がるため、モニタ用に点灯させている白色LEDがチラチラします。そこで白色LEDはやめて緑色にしたら若干目立たなくなったのでOKとしました。
写真はLED照明の端カバーに基板を収めた様子です。照明の拡散カバーの切り欠きはTOFセンサと干渉するためカットした跡です。
プログラム(PIC アセンブラ)です。こちらも無保証です。著作権等は留保しますが、流用・改造などご自由にどうぞ。
;---------------------------------------------------------------------
; TOF近接センサVL6180Xを使った非接触スイッチ
;
; 2026.02.22 naka
; 1. 概要
; 近接センサの前で手をかざすとオンオフ動作するスイッチ
; ・距離は180mm位まではOK(動作確認時190mm程度までは反応した)#defineで設定
; ・スイッチ動作はオルタネート(一度近づくとオン、一旦離れてもう一度でオフ)
; ・距離測定は0.1秒毎、オンオフ動作時は1秒後に確認(チャタリング的な動作を避けるため)
;
; 2. ピンアサイン
;
; (1). GP0 [in] : (ICSP DAT)
; (2). GP1 [in] : (ICSP CLK)
; (3). GP2 [out]: LED(デバッグ時に使用;最終的にSSRに置き換える)
; (4). GP3 [in] : (ICSP VPP)
; (5). GP4 [in] : I2C SDA
; (6). GP5 [in] : I2C SCL
;
; 3. 備考
; ・動作クロック :内蔵OSC 4MHz
; ・電源 :3V(TOFセンサが2.8-3.0Vなので)
; ・I2Cの応答待ちなどによる無限ループ対策にWDTを利用
;
; 4. 改版履歴
; 2026.02.14 new
; 2026.02.22 色々修正
;
;---------------------------------------------------------------------
;---------------------------------------------------------------------
; デバイス定義
;---------------------------------------------------------------------
LIST P=12F629
INCLUDE <P12F629.INC>
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CP_OFF
ERRORLEVEL -302 ;アセンブル時のバンク警告メッセージ抑制
;---------------------------------------------------------------------
; ピン定義
;---------------------------------------------------------------------
#define LED 2
#define SDA 4
#define SCL 5
;---------------------------------------------------------------------
; TOFセンサ VL6180X I2Cアドレス
;---------------------------------------------------------------------
#define TOFADDR 0x52
;---------------------------------------------------------------------
; TOFセンサが反応する距離(mm) これより近いとオン/オフする
;---------------------------------------------------------------------
#define ACTDIST D'180'
;---------------------------------------------------------------------
; 変数レジスタの定義
;---------------------------------------------------------------------
WAIT1 EQU H'20'
WAIT2 EQU H'21'
CNT1 EQU H'22'
CNT2 EQU H'23'
OFFSET EQU H'24'
RANGE EQU H'25'
TIMOUTH EQU H'26'
TIMOUTL EQU H'27'
TOGGLE EQU H'28' ; 0ビット:トグル、1ビット:前回状態
; H'40'からI2C通信に利用(下の方で定義)
;
;---------------------------------------------------------------------
; マクロ
;---------------------------------------------------------------------
; TOFセンサ8ビットレジスタ設定
REG8BIT MACRO IDXH,IDXL,DATA
RETLW IDXH
RETLW IDXL
RETLW DATA
ENDM
; TOFセンサ16ビットレジスタ設定
REG16BIT MACRO IDXH,IDXL,DATAH,DATAL
RETLW IDXH
RETLW IDXL
RETLW DATAH
RETLW DATAL
ENDM
;
; TOFセンサレジスタ書き込み
WTREG MACRO HIGH,LOW,DATA
MOVLW TOFADDR
CALL I2CWSTART
MOVLW HIGH
MOVWF datao
CALL TX
MOVLW LOW
MOVWF datao
CALL TX
MOVLW DATA
MOVWF datao
CALL TX
CALL I2CSTOP
ENDM
RDREG MACRO HIGH,LOW
MOVLW TOFADDR
CALL I2CWSTART
MOVLW HIGH
MOVWF datao
CALL TX
MOVLW LOW
MOVWF datao
CALL TX
CALL I2CSTOP
;
MOVLW TOFADDR
CALL I2CRSTART
CALL RX
CALL I2CSTOP
ENDM
;
;---------------------------------------------------------------------
; リセットベクタ
;---------------------------------------------------------------------
ORG 00H ; リセット時の飛び込み先
GOTO MAIN ;
;
ORG 04H ; 割り込み時の飛び込み先
;---------------------------------------------------------------------
; 割り込み処理
;---------------------------------------------------------------------
INTRUPT
RETFIE
;---------------------------------------------------------------------
; メイン処理
;---------------------------------------------------------------------
MAIN
CALL DEVINIT
;
CALL VL6180INIT
CALL VL6180CONFIG
;
CLRF TOGGLE
;
MAIN_LP
CLRF RANGE
CALL READRANGE ; 測定
;
MOVF RANGE,W
SUBLW ACTDIST ; アクティブか否かチェック
BTFSS STATUS,C
GOTO INACT
; 前回もアクティブなら何もしない(そうしないと点滅する)
BTFSC TOGGLE,1
GOTO NEXTREAD
BSF TOGGLE,1 ; 前回アクティブではないのでトグル動作
GOTO TOGGLESW
;
INACT
BCF TOGGLE,1
GOTO NEXTREAD
TOGGLESW
MOVF TOGGLE,W
XORLW H'01'
MOVWF TOGGLE
;
BTFSS TOGGLE,0
GOTO $+3
BSF GPIO,LED
GOTO $+2
BCF GPIO,LED
;
CALL W05S ; トグル動作時は1秒待つ
CALL W05S
GOTO MAIN_LP
;
NEXTREAD
CALL W100MS ; 100ミリ秒ごとに測定
CLRWDT
GOTO MAIN_LP
;
;---------------------------------------------------------------------
; 初期化
;---------------------------------------------------------------------
DEVINIT
CLRF INTCON ;全割込み禁止
;
BANKSEL CMCON
MOVLW B'00000111' ; GP0-2をデジタルI/Oに設定
MOVWF CMCON ; デフォルトはコンパレータ
; BANKSEL 1
; CALL 3FFH ; 内部OSCのキャリブレーションデータ
; MOVWF OSCCAL ; OSCCALレジスタにセット
BANKSEL TRISIO
MOVLW B'00000011' ; RA0,RA1 input
MOVWF TRISIO
BANKSEL GPIO
;
BANKSEL 0
CLRWDT ; Clear WDT
CLRF TMR0 ; Clear TMR0
;
BANKSEL OPTION_REG
MOVLW b'00101101' ; WDTプリスケーラ 1:32 (576ms)
MOVWF OPTION_REG
BANKSEL 0
;
BCF GPIO,LED
;
RETURN
;
;---------------------------------------------------------------------
; VL6180レジスタindex (#define名は32文字まで)
;---------------------------------------------------------------------
#define READOUT__AVERAGING_SAMPLE_PERIOD 0x01,0x0A
#define SYSALS__ANALOGUE_GAIN 0x00,0x3F
#define SYSALS__INTEGRATION_PERIOD 0x00,0x40
#define SYSALS__INTERMEASUREMENT_PERIOD 0x00,0x3E
#define SYSRANGE__VHV_REPEAT_RATE 0x00,0x31
#define SYSRANGE__VHV_RECALIBRATE 0x00,0x2E
#define SYSRANGE__INTERMEASUREMENT_PERIO 0x00,0x1B
#define SYSRANGE__MAX_CONVERGENCE_TIME 0x00,0x1C
#define SYSTEM__INTERRUPT_CONFIG_GPIO 0x00,0x14
#define SYSTEM__INTERRUPT_CLEAR 0x00,0x15
#define INTERLEAVED_MODE__ENABLE 0x02,0xA3
#define RESULT__RANGE_STATUS 0x00,0x4D
#define RESULT__INTERRUPT_STATUS_GPIO 0x00,0x4F
#define SYSRANGE__START 0x00,0x18
#define RESULT__RANGE_VAL 0x00,0x62
;
;---------------------------------------------------------------------
; VL6180初期化(メモリ節約のためベタ書きではなくループを回した)
;---------------------------------------------------------------------
VL6180INIT
CLRF OFFSET
CALL REG8BITDT
MOVWF CNT1 ; 設定パラメタ数
VLINIT_LP1
MOVLW H'52' ; アドレス
CALL I2CWSTART
MOVLW D'3' ; indexHigh, indexLow, data の3バイトを送る
MOVWF CNT2
VLINIT_LP2
INCF OFFSET,F
CALL REG8BITDT
MOVWF datao
CALL TX ; I2C送信
DECFSZ CNT2,F
GOTO VLINIT_LP2
;
CALL I2CSTOP
;
DECFSZ CNT1,F
GOTO VLINIT_LP1
;
RETURN
REG8BITDT ; 以下のテーブルから順に取り出す
ORG H'100'
MOVLW H'01'
MOVWF PCLATH
MOVF OFFSET,W
ADDWF PCL,F
RETLW D'31' ; 31パラメタ
REG8BIT 0x02,0x07,0x01 ; indexHigh, indexLow, data
REG8BIT 0x02,0x08,0x01
REG8BIT 0x00,0x96,0x00
REG8BIT 0x00,0x97,0xFD ; RANGE_SCALER = 253
REG8BIT 0x00,0xE3,0x01
REG8BIT 0x00,0xE4,0x03
REG8BIT 0x00,0xE5,0x02
REG8BIT 0x00,0xE6,0x01
REG8BIT 0x00,0xE7,0x03
REG8BIT 0x00,0xF5,0x02
REG8BIT 0x00,0xD9,0x05
REG8BIT 0x00,0xDB,0xCE
REG8BIT 0x00,0xDC,0x03
REG8BIT 0x00,0xDD,0xF8
REG8BIT 0x00,0x9F,0x00
REG8BIT 0x00,0xA3,0x3C
REG8BIT 0x00,0xB7,0x00
REG8BIT 0x00,0xBB,0x3C
REG8BIT 0x00,0xB2,0x09
REG8BIT 0x00,0xCA,0x09
REG8BIT 0x01,0x98,0x01
REG8BIT 0x01,0xB0,0x17
REG8BIT 0x01,0xAD,0x00
REG8BIT 0x00,0xFF,0x05
REG8BIT 0x01,0x00,0x05
REG8BIT 0x01,0x99,0x05
REG8BIT 0x01,0xA6,0x1B
REG8BIT 0x01,0xAC,0x3E
REG8BIT 0x01,0xA7,0x1F
REG8BIT 0x00,0x30,0x00
REG8BIT 0x00,0x16,0x00 ;SYSTEM__FRESH_OUT_OF_RESET
;
;---------------------------------------------------------------------
; VL6180 configureDefault
;---------------------------------------------------------------------
VL6180CONFIG
CLRF OFFSET
CALL CONFIGDT
MOVWF CNT1 ; 設定パラメタ数
VLCONFIG_LP1
MOVLW H'52' ; アドレス
CALL I2CWSTART
MOVLW D'3' ; indexHigh, indexLow, data の3バイトを送る
MOVWF CNT2
VLCONFIG_LP2
INCF OFFSET,F
CALL CONFIGDT
MOVWF datao
CALL TX ; I2C送信
DECFSZ CNT2,F
GOTO VLCONFIG_LP2
;
CALL I2CSTOP
;
DECFSZ CNT1,F
GOTO VLCONFIG_LP1
;
; テーブルのラストにある16bitパラメタ1個のみ
MOVLW D'4' ; indexHigh, indexLow, dataHigh, dataLow の4バイトを送る
MOVWF CNT2
VLCONFIG_LP3
INCF OFFSET,F
CALL CONFIGDT
MOVWF datao
CALL TX ; I2C送信
DECFSZ CNT2,F
GOTO VLCONFIG_LP3
;
CALL I2CSTOP
;
RETURN
;
CONFIGDT ; 以下のテーブルから順に取り出す
MOVLW H'01'
MOVWF PCLATH
MOVF OFFSET,W
ADDWF PCL,F
RETLW D'9' ; 8bit 9パラメタ + 16bit 1パラメタ
REG8BIT READOUT__AVERAGING_SAMPLE_PERIOD,0x30
REG8BIT SYSALS__ANALOGUE_GAIN,0x46
REG8BIT SYSRANGE__VHV_REPEAT_RATE,0xFF
REG8BIT SYSRANGE__VHV_RECALIBRATE,0x01
REG8BIT SYSRANGE__INTERMEASUREMENT_PERIO,0x09 ; 100ms
REG8BIT SYSALS__INTERMEASUREMENT_PERIOD,0x31 ; 500ms
REG8BIT SYSTEM__INTERRUPT_CONFIG_GPIO,0x24
REG8BIT SYSRANGE__MAX_CONVERGENCE_TIME,0x31 ; 49ms
REG8BIT INTERLEAVED_MODE__ENABLE,0x00
REG16BIT SYSALS__INTEGRATION_PERIOD,0x00,0x63 ; 16bitパラメタ(1個のみ)
;
;---------------------------------------------------------------------
; VL6180 readRange
;---------------------------------------------------------------------
READRANGE
; デバイスがreadyになるまで待つ
RDREG RESULT__RANGE_STATUS
MOVF datai,W
ANDLW H'01'
BTFSC STATUS,Z
GOTO READRANGE
;
; 測定開始フラグ設定
WTREG SYSRANGE__START,0x01
;
CLRF TIMOUTH ; タイムアウトカウント用
CLRF TIMOUTL
READRANGLP
CALL CHKTIMEOUT ; タイムアウト確認
BTFSS STATUS,Z
GOTO READRANGE2
MOVLW D'255' ; タイムアウト
MOVWF RANGE
RETURN
;
READRANGE2
; 測定完了確認
RDREG RESULT__INTERRUPT_STATUS_GPIO
MOVF datai,W
ANDLW 0x07
SUBLW 0x04
BTFSS STATUS,Z
GOTO READRANGLP
;
; 値を読み出す
RDREG RESULT__RANGE_VAL
MOVF datai,W
MOVWF RANGE
;
; 割り込みフラグクリア
WTREG SYSTEM__INTERRUPT_CLEAR, 0x01
;
RETURN
;
;---------------------------------------------------------------------
; センサのタイムアウトチェック(500ms)
; 1回の測定にざっと200usかかるとして 500ms/200us ... TIMOUTH=10
;---------------------------------------------------------------------
CHKTIMEOUT
MOVF TIMOUTL,W
ADDLW D'1'
MOVWF TIMOUTL
BTFSS STATUS,Z
RETURN
;
MOVF TIMOUTH,W
ADDLW D'1'
MOVWF TIMOUTH
SUBLW D'10' ; Zフラグを持ってリターン
RETURN
;
;---------------------------------------------------------------------
; ウェイト色々
;---------------------------------------------------------------------
W1MS
MOVLW D'110'
MOVWF WAIT1
W1MSLP
GOTO $+1
GOTO $+1
GOTO $+1
DECFSZ WAIT1,F
GOTO W1MSLP
GOTO $+1
GOTO $+1
NOP
RETURN
;
W100MS
MOVLW D'100'
MOVWF WAIT2
W100MSLP
CALL W1MS
DECFSZ WAIT2,F
GOTO W100MSLP
CLRWDT
RETURN
;
W05S
CALL W100MS
CALL W100MS
CALL W100MS
W200MS CALL W100MS
CALL W100MS
RETURN
;
;---------------------------------------------------------------------
; I2Cアクセスルーチン
; 流用元:Microchip Applicatin Note : AN982
; Interfacing I2C Serial EEPROMs to PIC10 and PIC12 Drivers
;---------------------------------------------------------------------
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; Filename: i2c_routines.inc
; Date: March 21, 2005
; File Version: 1.0
; Assembled using: MPLAB IDE 7.00.00.0
;
; Author: Chris Parris
; Company: Microchip Technology, Inc.
;
;*******************RAM register definitions**********************
#define STARTRAM 0x40 ; Start RAM at address 0x40
cblock STARTRAM
buffer ; Transfer/Receive bit buffer
datai ; Data input byte buffer
datao ; Data output byte buffer
bitcount ; Bit loop counter
bytecount ; Byte loop counter
addressH ; Word address pointer
addressL ; Word address pointer
loops ; Delay loop counter
loops2 ; Delay loop counter
pollcnt ; Polling loop counter
i2caddr
endc
;*******************Bit definitions*******************************
DO equ 0 ; TX/RX buffer output bit
DI equ 1 ; TX/RX buffer input bit
ACKB equ 2 ; ACK/NO ACK select bit
;*******************Delay Macros**********************************
; Each macro delay for 1 inst. cycle less than
; required, as the instruction immediately
; before the macro call provides 1 inst. cycle.
;*****************************************************************
THIGH macro ; Clock high time delay (5 us)
goto $+1 ; 2-inst. cycle delay (2 us)
goto $+1 ; 2-inst. cycle delay (2 us)
nop ; 1us
endm
THDSTA macro ; Start condition hold time delay (5 us)
goto $+1 ; 2-inst. cycle delay (2 us)
goto $+1 ; 2-inst. cycle delay (2 us)
nop ; 1us
endm
TSUSTA macro ; Start condition setup time delay (5 us)
goto $+1 ; 2-inst. cycle delay (2 us)
goto $+1 ; 2-inst. cycle delay (2 us)
nop ; 1us
endm
TSUSTO macro ; Stop condition setup time delay (5 us)
goto $+1 ; 2-inst. cycle delay (2 us)
goto $+1 ; 2-inst. cycle delay (2 us)
nop ; 1us
endm
TAA macro ; Output valid from clock delay (4 us)
goto $+1 ; 2-inst. cycle delay (2 us)
goto $+1 ; 2-inst. cycle delay (2 us)
endm
;-------------------------------------------------------------------
; I2Cアクセス
;-------------------------------------------------------------------
I2CWSTART
MOVWF i2caddr ; I2Cアドレス退避
call BSTART ; Generate start bit
; Now send the control byte
; for a write, to set address
movf i2caddr,W ; I2Cアドレス
movwf datao ; Copy control byte to buffer
call TX ; Output control byte to device
RETURN
I2CSTOP
CALL NOACK
call BSTOP ; Generate stop bit
RETURN
;
I2CRSTART
IORLW H'01'
MOVWF i2caddr ; I2Cアドレス退避
call BSTART ; Generate start bit
; Now send the control byte
; for a write, to set address
movf i2caddr,W
movwf datao ; Copy control byte to buffer
call TX ; Output control byte to device
RETURN
;*******************Start bit subroutine**************************
; This routine generates a Start condition
; (high-to-low transition of SDA while SCL
; is still high.
;*****************************************************************
BSTART
bsf GPIO,SCL ; Make sure SCL is high
TSUSTA ; Start condition setup time delay
BANKSEL 1
BCF TRISIO,SDA ; Configure SDA to be an output
BANKSEL 0
bcf GPIO,SDA ; Pull SDA low to initiate
; Start condition
THDSTA ; Start condition hold time delay
bcf GPIO,SCL ; Bring SCL low in preparation
; for data transfer
BANKSEL 1
BSF TRISIO,SDA ; Configure SDA to be an input
BANKSEL 0
retlw 0
;*******************Stop bit subroutine***************************
; This routine generates a Stop condition
; (low-to-high transition of SDA while SCL
; is still high.
;*****************************************************************
BSTOP
BANKSEL 1
BCF TRISIO,SDA ; Configure SDA to be an output
BANKSEL 0
bcf GPIO,SDA ; Pull SDA low
bsf GPIO,SCL ; Make sure SCL is high
TSUSTO ; Stop condition setup time delay
BANKSEL 1
BSF TRISIO,SDA ; Configure SDA to be an input
BANKSEL 0
retlw 0
;*******************Bit output subroutine*************************
; This routine outputs bit 'DO' in 'buffer' to
; the serial EEPROM device.
;*****************************************************************
BITOUT
bcf GPIO,SCL ; Make sure SCL is low
btfss buffer,DO ; Check for state of bit to xmit
goto bitlow ; If bit is low, pull SDA low
clockout ; If bit is high, leave SDA high
bsf GPIO,SCL ; Bring SCL high to begin transfer
THIGH ; Clock high time delay
bcf GPIO,SCL ; Bring SCL low again
BANKSEL 1
BSF TRISIO,SDA ; Configure SDA to be an input
BANKSEL 0
retlw 0
bitlow
BANKSEL 1
BCF TRISIO,SDA ; Configure SDA to be an output
BANKSEL 0
bcf GPIO,SDA ; Pull SDA low
goto clockout
;*******************Bit input subroutine**************************
; This routine inputs a bit of data from the
; serial EEPROM device, and stores it in bit
; 'DO' of 'buffer'.
;*****************************************************************
BITIN
bcf GPIO,SCL ; Make sure SCL is low
BANKSEL 1
BSF TRISIO,SDA ; Configure SDA to be an input
BANKSEL 0
bsf buffer,DI ; Assume input bit is high
bsf GPIO,SCL ; Bring SCL high to begin transfer
TAA ; Output valid from clock delay
btfss GPIO,SDA ; Check for state of SDA bit
bcf buffer,DI ; If SDA is low, set bit low
bcf GPIO,SCL ; Bring SCL low again
retlw 0
;*******************Data transmit subroutine**********************
; This routine transmits the byte of data
; stored in 'datao' to the serial EEPROM
; device. Instructions are also in place
; to check for an ACK bit, if desired.
; Just replace the 'goto' instruction,
; or create an 'ackfailed' label, to provide
; the functionality.
;*****************************************************************
TX
movlw .8
movwf bitcount ; Initialize loop counter to 8
txlp
bsf buffer,DO ; Assume output bit is high
btfss datao,7 ; Check state of next output bit
bcf buffer,DO ; If low, set buffer bit low
call BITOUT ; Call routine to output bit
rlf datao,F ; Rotate datao left for next bit
decfsz bitcount,F ; Decrement counter, check if done
goto txlp ; Keep looping
CALL ACK
retlw 0
;*******************Data receive subroutine***********************
; This routine reads in one byte of data from
; the serial EEPROM device, and stores it in
; 'datai'. It then responds with either an
; ACK or a NO ACK bit, depending on the value
; of 'ACKB' in 'buffer'.
;*****************************************************************
RX
clrf datai ; Clear input buffer
movlw .8
movwf bitcount ; Initialize loop counter to 8
bcf STATUS,C ; make sure carry bit is low
rxlp
rlf datai,F ; Rotate datai 1 bit left
call BITIN ; Read a bit
btfsc buffer,DI
bsf datai,0 ; Set bit 0 if necessary
decfsz bitcount,F ; 8 bits done?
goto rxlp ; If not, do another
call BITIN ; Call routine to read ACK bit
RETLW 0
ACK
bcf buffer,DO ; If ACKB = 1, send ACK (DO = 0)
call BITOUT ; Send bit
retlw 0
NOACK
bsf buffer,DO ; If ACKB = 1, send ACK (DO = 0)
call BITOUT ; Send bit
retlw 0
;
;---------------------------------------------------------------------
END
;---------------------------------------------------------------------
; 終わり
;---------------------------------------------------------------------
2026年3月25日水曜日
シエラレオネから届いた荷物
先週末はイベントがあって、三連休+1日年次休暇の四連休にしましたが工作の進捗はなく、平日に 見守りセンサのプログラムを修正 したりしていました。一応書けたけどテストはまだ。
そんな中、シエラレオネから国際郵便が届きました。聞いたことあるけど何処だっけ?
















































