SVX日記
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のページ内に記述を発見。ざざっと読んで、次はMicrochipTechnologyのPIC16F819のオフィシャル英文マニュアルを読む。このマニュアルだけだとちょっとキツイんだよな。もうすこし実際のコード例が多いと助かるのだが。
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つの押しボタンと、傾斜センサ。イッペイはやたらとモノを床に打ち付けるのが好きなので、頻繁な傾斜センサの反応が期待できる。一方で、まだ押しボタンを押す頭はないので、これは将来に期待というところ。
2010-08-12(Thu) 宇宙戦艦ヤマト 復習篇
月額制の通信DVDレンタルをやめてしばらく経つ。先日、借りたいものが空いていたのでスポットで借りたら、10日という返却期限にかかりそうになってアセったことがあった。十分に余裕は見たつもりだったのだが、郵便事情の責をユーザ側に押しつけるサービスというのはちょっとどうかと思う。まぁ、そのためのデフォルト月額制なんだが。
おぉ!! 頼んでおいたのが借りられたか!! 熱望するほど観たいわけではないが、割とデキがいいと聞いているし、これはかなり楽しみである。子供の頃「愛の戦士たち」を観に映画館に足を運んだのを思い出す。
は? 新作……じゃなかったとしても、さすがに準新作の範疇だよな。なんかのキャンペーンでもあったっけ? ……っ、も……もしかして、カミさん、間違えて「完結編」を借りてきたんじゃあるまいか……うーむむむ、ちゃんと観たことはなかったし、最悪「完結編」だったとしても、まぁ、観る価値はあるけどさ……
そういえば、カミさんには「そうだ、ヤマト借りてきて!!」としか言わなかったもんなぁ。完結編から27年を経た新作なんだとか、もうすぐ実写版の上映を控えてるとか、そういう予備知識をカミさんに期待した方が間違いなんだけどさぁ。
2011-08-12(Fri) 続々と、スピーカ、作る
先日、スピーカの容積を計測するために、100円のタッパーをふたつばかり追加購入したのだが、なんとなくやり始めたところ、やり始めたら止まらなくなってしまい、結局、こないだ秋月で購入した300円のスピーカの取り付けまでを済ませてしまった。タッパーとはいえ、キレイに丸い穴を空けるのはかなりタフな作業だったのだが……あぁ、疲れた……。
とりあえず、タッパーのフタを少しめくり、後方簡易バスレフ型の状態にして、音を出してみる。うーむ、違うね。どこがどうとは言えないが確かに違う。なんだろうね、この違いは。こーゆー気持ちがオーディオマニアへの入り口なんだろうなぁ。アブないなぁ。アブないねぇ。
先日、割った薪の切断面の平滑化も、ボチボチと進めている。これまた、かなりタフな作業。作業の甲斐あって、完全なスベスベまで、もう一歩のところまで来たが……なんか最近、コスってばかりだ……はぁ。
夕方、風呂で汗を流してから、5歳のガキをつれて、近所の焼鳥屋に行く。実は2回目だ。5歳のガキを居酒屋につれていくなんざ、なんてぇヤクザな親だ、と思われるかもしれない……んが、しかし、この居酒屋、むしろ子連ればかりなのであり、実のところ「焼鳥ファミレス」なのである。オッサン同士で行ったら、むしろ浮くくらいに子供だらけ。タバコの煙が漂ってくると、こんな場所でタバコを吸うなんてッ!! と……思わず居酒屋であることすら忘れてしまうくらいの雰囲気なのである。
店の前に「ご家族でのご利用歓迎」なんて書いてあり、子供向けのメンバーズカードが用意してあり、スーパーボールの当たるクジを引かせてくれる。ぜんぜんワケがわからない。最初からそう言うマーケティングで店を出したのか、途中でそういうニーズにキャッチアップしたのか。できて間もないんだがなぁ。どちらにせよ、ものすごい盛況なんで、成功してはいるんだが、どちらにせよ、驚きである。
2016-08-12(Fri) Fedoraでpidoraインストール
どうもRaspbianは挙動不審であり、調査しようにもアウェー感が半端ないんで、Fedoraを動かしたい。んが、以前に動かそうとしたが、うまく動かせなかったんだよな、と思っていたら、ナニ!? NOOBSってのは、OSを選択してインストールするための仕組みだったのかよ。それを早く言ってくれよ。
どうも、SDカードにイメージをddで書き込むのではなく、vfat領域の上にファイルコピーすれば動くらしい。ホンマにそんなんでブートすんのか? と、やってみたら、確かにブートする。これは未知の技術だな。
※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
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"]