SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|

2004-08-12(Thu) PWM制御下調べ

  今日は夕方に食事に行って呑んでたりしてた。よって、作業も少しだけ。先日購入したアナログメータを利用するためのPWM制御方法について勉強してみた。PWM制御というのは、簡単にいうとスイッチのON/OFFを高速で繰り返すことによって、ONとOFFの中間の出力を取り出す方法のこと。チョッパ制御ともいうらしい。また、PCのスイッチング電源の「スイッチング」もスイッチのON/OFFのことを指していて、PWM制御している電源のことである(たぶん)。

  PWM制御は単純にスイッチのON/OFFをするだけなので、PIC上のプログラムで直接ON/OFFを制御してもいい(実際、以前にPIC12F629を用いて作ったUSB扇風機用1/fゆらぎアドオン基板はそうした)のだが、アナログメータを動かす場合は他にもいろんな処理をしたいので、プログラムがPWM制御するのにかかりっきりになるのはよろしくない。そこで、PIC16F819またはPIC16F648Aあたりに最初から備わっているPWM機能を利用して実現するという寸法である。そのための方法を勉強するのである。

  まずは、Webで検索してPICFANのページ内に記述を発見。ざざっと読んで、次はMicrochipTechnologyPIC16F819のオフィシャル英文マニュアルを読む。このマニュアルだけだとちょっとキツイんだよな。もうすこし実際のコード例が多いと助かるのだが。

9.3.3 PWM制御の設定
CCPモジュールをPWM制御に設定する場合、以下のステップが推奨される。
1.PWM周期をPR2レジスタに書き込む
2.PWMのON割合をCCPR1LとCCP1CON<5:4>に書き込む
3.TRISBをクリアし、CCP1を出力に設定
4.TMR2プリスケーラを設定し、T2CONに書き込んでTimer2を有効にする
5.CCP1CONをPWMモードに設定する(CCP1モジュールをPWMモードに設定する)
Note: TRISBの2か3かは、コンフィギュレーションビットの12ビット目(CCPMX)による

  とーとつだが、一部を訳してみた。では、また明日。


2006-08-12(Sat) その筋を育てるベビートイ

  さて、新たな技術的挑戦をするつもりはないが、新たなプロジェクトの旗揚げする。ウチのガキにアレゲなオモチャを作ってやるのである。

  以前から、イッペイにはオモチャのキーボードで貸し与えて遊ばせているのだが、実はイッペイが強烈に興味を示しているのは「リズムに合わせて点滅するLED」なのであった。なんだか、いつも高音側のキーボードをナメまわしていると思ったら、単にチカチカするLEDをノゾき込みたいからのようだ……LEDフェチかオマエは。まぁ、気持ちはわかるけどさ。

  画像の説明

  そんなに点滅するLEDが好きなら、そういうオモチャを作ってやるよ。オマケに手元の電子パーツを適当に組み合わせてオモチャっぽくしてやる。以前に、なんとなく買った、振動モータに、なんとなく買った、メロディICに、なんとなく買った、傾斜スイッチ……全部投入である。当然、制御はPICマイコンで。ポート数の都合でPIC16F648Aをチョイス。

  とりあえず、ガワだけはサクサクと仕上げる。一応、ケースをナメ回すコトを考慮に入れ、ケースは事前に中性洗剤で洗浄。カジったりするコトを考慮に入れ、せっかく生えた乳歯を痛めないよう、ケース表面のパーツはプラスチック製に限定した。皿ネジといえど表面に金属パーツを出さないようにも配慮する。内部に実装する部品や基板はホットボンドで固定してしまう予定。

  画像の説明

  入力は、3つの押しボタンと、傾斜センサ。イッペイはやたらとモノを床に打ち付けるのが好きなので、頻繁な傾斜センサの反応が期待できる。一方で、まだ押しボタンを押す頭はないので、これは将来に期待というところ。

  出力は、3色のLEDとモータによる振動、メロディICによる電子メロディ。これらは、入力に応じてなんらかの反応を示すようにするが、当然ながらワイヤードロジックでなくPICによる制御を行う予定なので、イッペイが飽きたら少し反応を変えてやるとか、一定のシーケンスでボタンを押さないと反応しなくなるなど、ファームウェアのアップデートにより、ある程度の仕様変更が可能となる予定である(おぉ、なんかこう書くとカッチョエエなぁ)。

  ちゅーわけで、ソフトはまた後日。では。



2010-08-12(Thu) 宇宙戦艦ヤマト 復習篇

  月額制の通信DVDレンタルをやめてしばらく経つ。先日、借りたいものが空いていたのでスポットで借りたら、10日という返却期限にかかりそうになってアセったことがあった。十分に余裕は見たつもりだったのだが、郵便事情の責をユーザ側に押しつけるサービスというのはちょっとどうかと思う。まぁ、そのためのデフォルト月額制なんだが。

  というわけで、しばらくレンタルするのを躊躇していた今日このごろ、カミさんがフツーにレンタル屋に行ったらしく、職場にメールが来た。

  「ヤマト借りたっちゃ」

  おぉ!! 頼んでおいたのが借りられたか!! 熱望するほど観たいわけではないが、割とデキがいいと聞いているし、これはかなり楽しみである。子供の頃「愛の戦士たち」を観に映画館に足を運んだのを思い出す。

  そういえば「完結編」の上映時期が「幻魔大戦」とモロに当たったので、迷いに迷った挙げ句、結局どちらも観に行けなかった、なんてこともあったっけ。

  わくわくしながら、帰宅した。私の映像作品の視聴時間は電車の中に限られている。早速、PSPに放り込むべくリッピング作業にかかる。そういえば、レンタル期限はいつまで?

  「一週間レンタルだよ」

  は? 新作……じゃなかったとしても、さすがに準新作の範疇だよな。なんかのキャンペーンでもあったっけ? ……っ、も……もしかして、カミさん、間違えて「完結編」を借りてきたんじゃあるまいか……うーむむむ、ちゃんと観たことはなかったし、最悪「完結編」だったとしても、まぁ、観る価値はあるけどさ……

  画像の説明

  「!」

  な、なんと、予想を14万8千光年くらい上回る結果だった。なんと「テレビ版の(1)」である。そりゃ、一週間レンタルのはずだよ……トホホ。

  そういえば、カミさんには「そうだ、ヤマト借りてきて!!」としか言わなかったもんなぁ。完結編から27年を経た新作なんだとか、もうすぐ実写版の上映を控えてるとか、そういう予備知識をカミさんに期待した方が間違いなんだけどさぁ。

  とはいえ、TV版の(1)も、クライマックス以外は、ちゃんと観たことはなかった気がする。まぁ、せっかくなので、それはそれとして、ウチのガキと一緒に観てみるとしようかな。


2011-08-12(Fri) 続々と、スピーカ、作る

  今日は、ちょっとした所用で仕事は休み。というわけで、おもむろに作業を開始したりする。

  先日、スピーカの容積を計測するために、100円のタッパーをふたつばかり追加購入したのだが、なんとなくやり始めたところ、やり始めたら止まらなくなってしまい、結局、こないだ秋月で購入した300円のスピーカの取り付けまでを済ませてしまった。タッパーとはいえ、キレイに丸い穴を空けるのはかなりタフな作業だったのだが……あぁ、疲れた……。

  画像の説明

  とりあえず、タッパーのフタを少しめくり、後方簡易バスレフ型の状態にして、音を出してみる。うーむ、違うね。どこがどうとは言えないが確かに違う。なんだろうね、この違いは。こーゆー気持ちがオーディオマニアへの入り口なんだろうなぁ。アブないなぁ。アブないねぇ。

  画像の説明

  先日、割った薪の切断面の平滑化も、ボチボチと進めている。これまた、かなりタフな作業。作業の甲斐あって、完全なスベスベまで、もう一歩のところまで来たが……なんか最近、コスってばかりだ……はぁ。

  夕方、風呂で汗を流してから、5歳のガキをつれて、近所の焼鳥屋に行く。実は2回目だ。5歳のガキを居酒屋につれていくなんざ、なんてぇヤクザな親だ、と思われるかもしれない……んが、しかし、この居酒屋、むしろ子連ればかりなのであり、実のところ「焼鳥ファミレス」なのである。オッサン同士で行ったら、むしろ浮くくらいに子供だらけ。タバコの煙が漂ってくると、こんな場所でタバコを吸うなんてッ!! と……思わず居酒屋であることすら忘れてしまうくらいの雰囲気なのである。

  店の前に「ご家族でのご利用歓迎」なんて書いてあり、子供向けのメンバーズカードが用意してあり、スーパーボールの当たるクジを引かせてくれる。ぜんぜんワケがわからない。最初からそう言うマーケティングで店を出したのか、途中でそういうニーズにキャッチアップしたのか。できて間もないんだがなぁ。どちらにせよ、ものすごい盛況なんで、成功してはいるんだが、どちらにせよ、驚きである。

  画像の説明

  とはいえ、5歳のガキとふたりで居酒屋なんて、さすがに間が持たないかもなぁ、なんて心配しつつ行ったのだが「タレと塩のどっちがおいしいか勝負」なんてイベントを挟みつつ、ホッピーを流し込んでいるうちに、自分的にはまったくフツーの呑み会の感触で、気づくといい気分になっていた。

  最後にソフトクリームを食わせつつ、一丁締め。よぉーっ、パン……って、オレはいったいガキに何を教え込んでいるんだぁ……。


2016-08-12(Fri) Fedoraでpidoraインストール

  どうもRaspbianは挙動不審であり、調査しようにもアウェー感が半端ないんで、Fedoraを動かしたい。んが、以前に動かそうとしたが、うまく動かせなかったんだよな、と思っていたら、ナニ!? NOOBSってのは、OSを選択してインストールするための仕組みだったのかよ。それを早く言ってくれよ。

  というわけで、noobs_lite_v1_9.zipをダウンロードしてzip展開したところ、手元にファイルがどっ散らかった。うげ。なにこれ?

  どうも、SDカードにイメージをddで書き込むのではなく、vfat領域の上にファイルコピーすれば動くらしい。ホンマにそんなんでブートすんのか? と、やってみたら、確かにブートする。これは未知の技術だな。

  Linuxでやるならば以下の手順だが、パーティションの設定がマズいと動かないので注意だ。

※SDカードが/dev/sdbとして認識されている場合
/root # dd if=/dev/zero of=/dev/sdb bs=65535 count=1024
/root # fdisk /dev/sdb
※パーティションのタイプをc, 起動可能フラグを有効化
/dev/sdb1  *        2048 31116287 31114240  14.9G  c W95 FAT32 (LBA)
/root # mkfs.vfat /dev/sdb1 
/root # mount /dev/sdb1 /mnt/temp
/root # cd /mnt/temp
/mnt/temp # unzip NOOBS_lite_v1_9.zip -d .
/mnt/temp # cd
/root # umount /mnt/temp

  あとは、ラズベリーパイ(今回はPi1のB+)にSDカードを挿して、LANケーブル、キーボード、マウス、テレビ、電源をつないで、GUIからpidoraを選択して30分くらい待つだけだ。なんだ、お気楽やん。


2021-08-12(Thu) dockerでcronを使わずに周期実行

  諸君、私はdockerが好きだ。諸君、私はdockerが好きだ。諸君、私はdockerが大好きだ。KubernetesやOpenShiftも便利には違いないが、個人で使うにはアレは重すぎるものだ。では、どんなコンテナ管理を望むか? よろしい、ならばdocker-composeだ。

  自分は長らく自宅サーバを運用しているが、過去記事によれば立ち上げたのは2002年の4月頃らしいから、もうすぐ20年というところ。当然、何度もサーバの移行を繰り返してきたが、この作業が面倒で仕方なかった。

  昔はPCのアプリの導入も「実行ファイルをコピーするだけ」だったが、いつのまにか「インストーラ」なるものを使うのが普通になった。まぁ、構成ファイルが一定数以上になれば仕方ないのだが、それは「システムに永続的な変更をもたらすにも関わらず、何をしでかすかを知りえないプログラム」であるから、いまだ実行するには抵抗がある。

  Linuxの場合、RPMを使う限り安心して導入できるが、データや設定の引き継ぎや、バージョンで仕様に差異があるなど、どうしても細々とした作業が必要となってしまう。長らくどうにかならないものかと思っていたが、ある日、そんな解決方法があったのかと目からウロコが落ちた。それがdockerだ。

  データや設定を分離し、OS環境とアプリと構築手順をまとめてカートリッジ化してしまう。一度、そうしてしまえば、docker/docker-composeが使える環境でありさえすれば、どのカートリッジだろうが、ほぼ共通の僅かなコマンドだけでサービスが起動できてしまう。想像もできなかった解決方法だ。しかし、欲しかったのはまさにこれなのだ。

  そして、意外と楽しいのが、Dockerfileとdocker-compose.ymlを書く作業だ。できるだけ無駄なく、美しく、構築手順を詰めていく。つまり、最低限のコマンド以外の全てを削ぎ落として箱詰めしてカートリッジ化する……おやおや、おやおやおやおや、なんと……なんと素晴らしい……。

  <かきかけ>

# Dockerfile 中の設定スクリプトを抽出するスクリプトを出力、実行
COPY Dockerfile .
RUN echo $'\
cat Dockerfile | sed -n \'/^##__BEGIN0/,/^##__END0/p\' | sed \'s/^#//\' > startup.sh\n\
' > extract.sh && bash extract.sh
  
# docker-compose up の最後に実行される設定スクリプト
##__BEGIN0__startup.sh__
#
#   # easy cron
#   now=`date +%s`
#   target0=$((now - now % ${CYCLE0:=86400}   + ${SCHED0:=$(( 5 * 60 +  4 * 3600 - 32400))}))               # day
#   while [ $target0 -lt $now ]; do
#       ((target0 += CYCLE0))
#   done
#   target1=$((now - now % ${CYCLE1:=604800}  + ${SCHED1:=$(( 5 * 60 +  2 * 3600 + 0 * 86400 - 378000))}))  # week
#   while [ $target1 -lt $now ]; do
#       ((target1 += CYCLE1))
#   done
#   target2=$((now - now % ${CYCLE2:=2419200} + ${SCHED2:=$(( 5 * 60 +  3 * 3600 + 0 * 86400 - 378000))}))  # 4weeks
#   while [ $target2 -lt $now ]; do
#       ((target2 += CYCLE2))
#   done
#
#   s=S
#   while true; do
#       pgrep -f httpd > /dev/null
#       if [ $? -ne 0 ]; then
#           echo "`date`: ${s}tart httpd."
#           /usr/sbin/httpd
#       fi
#       s=Res
#
#       # easy cron
#       if [ `date +%s` -ge $target0 ]; then
#           ((target0 += CYCLE0))
#           echo "`date`: Job easy cron 0 started."
#           (cd /var/lib/pv/hyperestraier; find documents/ -type f -name "*.$FILE_TYPE" | estcmd gather -cl $GATHER_OPTS -cm casket - | grep -v ' passed ')
#       fi
#       if [ `date +%s` -ge $target1 ]; then
#           ((target1 += CYCLE1))
#           echo "`date`: Job easy cron 1 started."
#           (cd /var/lib/pv/hyperestraier; estcmd purge -cl casket | grep -v ' passed')
#       fi
#       if [ `date +%s` -ge $target2 ]; then
#           ((target2 += CYCLE2))
#           echo "`date`: Job easy cron 2 started."
#           (cd /var/lib/pv/hyperestraier; estcmd optimize casket)
#       fi
#       sleep 5
#   done
#
##  target0=$((now - now % ${CYCLE0:=3600}    + ${SCHED0:=$(( 0 * 60))}))                                   # hour
##  target0=$((now - now % ${CYCLE0:=86400}   + ${SCHED0:=$(( 0 * 60 +  0 * 3600 - 32400))}))               # day
##  target0=$((now - now % ${CYCLE0:=604800}  + ${SCHED0:=$(( 0 * 60 +  0 * 3600 + 0 * 86400 - 378000))}))  # week
##  target0=$((now - now % ${CYCLE0:=2419200} + ${SCHED0:=$(( 0 * 60 +  0 * 3600 + 0 * 86400 - 378000))}))  # 4weeks
#
##__END0__startup.sh__
  
ENTRYPOINT ["bash", "startup.sh"]