2021年3月31日水曜日

メガネからコンタクトに変えてみて気づいたコンタクトのメリット・デメリット

 私は小学3~4年生の頃に視力を悪くして以来、ずっとメガネを着用して暮らしてきました。裸眼視力はかなり低く、今ではもう0.1を切っているはず。中学生の頃からメガネなしでは生活もままならないほどの視力になっていたので、周囲には「メガネの人だ」と認識されていたでしょう。

しかし、メガネを付けているとどうしてもメガネが曇ったりして視界が悪く、集中力の妨げになったり、道路を歩いているときなどに危険を回避するのが困難になったりします。特に近年は感染症対策でマスクを着用するため、普段からずっとメガネが曇るようになってしまいました。
そのほか、見た目上の印象を変えてみたいなあと思ったのも、コンタクトに切り替えようと思ったきっかけの一つです。

■コンタクトを買うまでの流れ
コンタクトレンズは、眼科で医師の診察を受けてからレンズを購入するのが一般的だと思います。眼科での診察はお医者さんによって違うと思います。私の場合は以下のような流れでした。

1. 眼の屈折度と眼圧を機械によって測定する。この間、メガネのレンズの度数も測ってもらいました
2. 裸眼、および矯正用レンズを付けて視力を測定
3. 医師によっていろいろ診察を受ける(何を検査してるんだろう?)。特に痛みを伴う検査はありませんでした。私の場合、アレルギー性結膜炎の疑いを指摘されました。
4. レンズを装着してもらう。はじめての人は片目にレンズを入れるのに15分弱かかるかも?
5. 両目にレンズを入れたら、眼に適合しているかを医師に検査してもらう
6. 目に合わない場合、レンズの種類を変えて再び医師の検査を受ける
7. 適合するレンズが見つかれば、装着練習を受ける。片目にレンズを入れて外すことができればレンズの購入許可が出るらしい。はじめての人は片目で10分くらいは苦戦すると思います。多分
8. レンズが買えたよやったね!

私の場合は適合するレンズがなかなかなく、5と6の間を何度も繰り返していました。また、はじめてレンズを入れるのも非常に苦戦しました。大変でした...
ちなみにですが、私が行った眼科はコンタクト販売店と隣り合わせになっていたので、特に処方箋のような物は受け取ることなく、コンタクトの購入までスムーズに進みました。

■コンタクトの付け外しと付け心地について
コンタクトレンズには色々種類があり、種類によって扱い方も付け心地も違うと思います。私が買ったのは「ワンデータイプのソフトレンズ」なので、他のレンズの場合はあまり参考にならないかも。
レンズを付ける場合、外す場合のどちらとも、痛みを伴うことは通常ありません。
ただ、レンズを外すのがすごーく難しいです。コンタクトレンズって、目にめちゃくちゃくっつこうとするので、はずそうとしてもなかなか外れてくれないので。しかも、正しく外さないと目を傷つけることになります。コンタクトレンズをはじめて付けてから1週間くらい経つんですが、まだまだ慣れません。というか、上手に外すの無理なんですけど❗❗って心の中で絶叫してます。
付け心地ですが、まるでレンズを付けていないかのような楽な付け心地です。レンズが大きくズレるということもなく快適です。ただ、乾燥はどうしても気になります。ほとんどの人は、目を潤すための目薬を携行しているのでは。私も買いました。

■コンタクトレンズを使って感じたメリット
・夜の景色がめちゃくちゃ綺麗
夜の街を歩くたびに毎回感動しています。メガネの場合だとどうしても、レンズ表面の微小な汚れによって曇ったように見えたり、光源の光芒が綺麗には見えなかったり、くすんだような色になって見えたりします。
ですが、コンタクトレンズだと、暗いところはしっかり暗く、明るいところはしっかり明るく見えるのでコントラストが高く感じられ、イルミネーションの色も原色に近いハッキリとした色に見えます。光芒もとても綺麗。

・レンズが曇らない
メガネの場合はマスクを着用していると曇るんですが、コンタクトレンズの場合はこれがないので、マスクとの相性は抜群です。また、メガネは使ってるとすぐに汚れますが、コンタクトレンズでは、見え方に影響するような汚れは起こらないと思います。

・がんばれば垢抜けるかも(きっと)
私見ですが、コンタクトに変えただけで垢抜けるかというとそう簡単な問題ではなく、髪、眉、服装全部見直して整えなければきびしそうです(多分)。イメチェンしてえ

■コンタクトレンズのデメリットとか弱点とか
・水に弱い
これはもしかしたらソフトレンズかワンデーレンズだけの話かもしれないんですが、涙液によって保護されているレンズなので、外部からの水の浸入とかには弱いらしいです。コンタクトをつけたまま入浴とか水泳とかはちょっとダメそう。水濡れしたレンズはすぐに交換する必要があるらしいです。
普段の入浴でも使えるかなあと思ってましたが考えが甘かったです。

・付け外しに時間がかかる
慣れると多分一瞬で付け外しできるはずなんですけど、慣れないうちはキビシいです。とはいっても付けるのは外すのに比べて難しくないので、朝の貴重な時間が奪われずに助かってます。

・付け外しで目を傷つける可能性がある
レンズを付けるのはそんなに難しくないので良いですが、レンズを外すのが難しいです。どうしても指が目の表面に触れるので、手こずると目を傷つけちゃいそうです。ぼくも取り外しに苦戦してるので、目が傷ついてるかも

・つけたままうっかり寝るとヤバい
電車やバスで移動中にコックリコックリしてしまう程度なら正直そんなにマズい自体にはならないですが(経験済み)、割とガッツリ目に睡眠してしまうと目にレンズが張り付いて大変よろしくないらしいです(未経験)。
眼科にGO! しなくて済むように、少しでも寝る場合はレンズを外しましょう。「寝ないから平気平気...ちょっとだけ...」とか言いながらベッドに横になったりすると悲劇の始まりなので、少しでも横になる場合は必ずレンズを外すというマイルールを作って守るようにしています。

■コンタクトを買ってよかったか?
結論から言うと、買って満足しています。
私の場合、マスクをしている間にメガネが曇るという大きな不満点を抱えていたので、その不満が解消されたのも大きいです。
ランニングコストが今のところ気になります。まだコンタクトに慣れていないので、ワンデーレンズを毎日使い捨てていますが、これが最もコストがかかります。今後は2週間交換タイプのソフトレンズに移行すると思うので、今後はコストの負担は下がりそうです。

2021年3月21日日曜日

ArduinoでLEDテープを光らせる

 最近大学の研究室に顔を出したら、このようなものを発見しました。


よくわからないLEDテープ。フルカラーLEDが144個繋がっています。
聞いたところによると、5V駆動で、割と大電流を消費するとのこと。

持ち帰って動かしてみてもよいということなので、しばらくお借りすることに。

今のところ分かっている情報は、「5V駆動であること」「3ピンで、うち1ピンが制御用端子であること」「PWM制御?らしいこと」「フルカラーでアドレサブルであること」などの情報のみ。
なんだか、パソコン用のARGBテープみたいですよね。

ですが、どうやら、Adafruit社のNeoPixelというLEDテープの同等品みたいで、NeoPixel用のライブラリを使用して、簡単に制御できることが分かりました。

回路を組んでみます。

5Vで大電流を流せる電源は、選択肢が限られます。例えば、ArduinoやRaspberry Piから取れる5V電源では電流が足りません。
今回は、以下の写真に示すようなケーブルを作り、パソコン用のATX電源の5V系統から電源をもらいました。PS_ON端子とGND端子をクローズしてATX電源をONするスイッチと、5VラインとGNDラインから電源をもらう線をつけています。
電線1本あたり5A程度流せると見積もったので、まあ十分でしょう。このLEDテープが何アンペア消費するのか、結局測定できていませんが...。

制御回路は適当につなぎました。外部電源のGND電位と、制御に使うマイコンボード(Raspberry PiやArduino等)のGND電位は揃うようにします(そうしないと制御端子の電位が浮いてしまうため)。5Vの電位は揃えていません。

まずは研究室からお借りしているRaspberry Pi 3Bで点灯させてみました。

綺麗に光っているように見えますが、光り方がまばらで、端のほうは点灯していません。どうやらこのLEDテープは制御端子の信号レベルが5V必要で、Raspberry Piの3.3Vレベルの制御信号ではうまく光らないみたいです。
レベル変換回路を組めば光らせられるのでは無いかと思いますが、部品の手持ちが無かったので今回はパス。

次は、手持ちのArduino互換機で点灯させてみました。

部屋を暗くして撮ったので肝心のマイコンが写っていませんが、端から端まで綺麗に点灯しています。この写真は、144個すべてのLEDチップをそれぞれランダムな色で点灯させている様子です。


今回書いたプログラムはこのようなものです。
NeoPixelおよびその同等品のLEDテープを制御可能な、FastLEDというライブラリを用いて簡単にコードを書けます。FastLEDはArduino IDEの「ライブラリを管理」という画面から導入できます。

2020年12月5日土曜日

Ubuntuサーバーの現状と今までにやったこと、今後のToDo

当初はLinuxの操作を勉強するために使い始めたLinuxマシン(NEC Mate上で絶賛稼働中)ですが、現在はサーバーの勉強のため、様々なサーバーアプリケーションが稼働しています。

現状、自宅のサーバーマシン(Ubuntu 20.04.1 LTS)は、概ね以下のような構成で稼働しています。

・Webmin (GUIサーバー管理ソフト、削除予定)
・Samba SMBサーバー (Webmin経由でセットアップ)
・OpenSSH SSHサーバー (パスワード認証方式)
・nginx Webサーバー
    ・phpBB3
    ・phpMyAdmin
    ・WordPress
・PHP-FPM 7.4 (via Unixドメインソケット)
    ・php-curl
    ・php-gd
    ・php-imagick
    ・php-mbstring
    ・php-mysql
    ・php-mbstring
    ・php-xml
・MySQLサーバー

多分以上ですべてだと思います。

Webminが導入されている理由ですが、最初はとにかくこのマシンをNAS代わりにしたく、色々試行錯誤していたんですがSambaのコンフィグレーションの仕方がわからず、とりあえず後先考えずにWebminをインストールした感じです。
Web上から余計な設定を叩けるツールをインストールしておくのはセキュリティを考えるとあまり好ましくなさそうなので、セキュリティホール潰しとしてアンインストールを考えています。ただ、私自身、Sambaの設定がよく分かっていないので、今WebminをアンインストールするとSMBサーバーのメンテができなくなりそうで怖いです。少し躊躇していますねえ。

主にやったことの詳細ですが...(時系列順ではない)

・Linuxの基本操作とパーミッションの仕組みについて正しく理解する
パーミッションとはファイルやディレクトリに対して行える操作の権限のことです。特定のユーザーやユーザーグループに対して正しくパーミッションを付与し、招かれざるユーザーには制限された権限を与える、といった設定を行う必要があります。このためには、chmodやchownなどのコマンドを使用しますが、コマンドの使用方法については検索してください。
難しそうだなあ、と最初は思いましたが、特にそんなこと無いです。簡単簡単。

・vi(m)の習得
いずれは通る道なので覚えておきたい。
Escキーを押して標準モード、iキーを押して挿入モード、oキーを押して行挿入、ddキーを押して行のカット、あたりを覚えておくといいかな。とにかく、モード切替を学べばあとは怖くありません。h, j, k, lを使ったカーソル移動は覚えるとmanコマンドでも役に立ちますが、ほとんどの場合は矢印キーでもカーソル移動できます。挿入モードだとデフォルトではカーソル移動にhjklを使えない?みたいなので、人によってはvimでも矢印キーをよく使ってるんじゃないかなあと思います。

・OpenSSHサーバーのインストール
sudo apt install -y openssh-server を叩くだけです。OK, やりましょう!
他のマシンからsshしてターミナルを叩けるのは非常に便利。ちなみに、自環境ではSFTPやSCPも特別に設定することなく使えるようになりました。
ところで余談ですが。インターネット経由でSSHしたい人もいるかもしれませんが、その場合はwell-knownポート番号(TCP: 22番)に設定してはいけないとされています。不正アクセス、不正ログインの温床のようです。どうしてもインターネット経由でSSHしたい場合は、49152 - 65535の範囲からポート番号を選べば良いでしょう。末尾を22以外に設定するのもおすすめで、たとえば59152などに設定するとSSH用のポート番号とは気づかれにくいです。ただ、ポートスキャンツールなどもあり、ポート番号の変更だけでは万全な対策とは言いがたいのが現状。攻撃対策は抜かりなく。

・FTPの暗号化(FTP→SFTP)
当初は考えなしに平文FTPのサーバーを運用していました。ですが、FTPは平文でユーザー名やパスワード、各種ファイルやディレクトリなどのデータを流してしまうため、今や運用してはいけないプロトコルの一つだと考えています。(ユーザー名やパスワードを要求しないのであれば別ですが)
個人的に、たとえLAN内であってもユーザー名やパスワードを平文で流すのは気持ち悪かったので、真っ先に暗号化しました。とはいっても、OpenSSHサーバーを導入しただけですが。

・nginxのURLリライト設定
phpBBやWordPressなど、Webアプリケーションの中には ".htaccess" ファイルが正常に機能し、URLがリライトされることを前提に作られているものがあります。これ困るんですよねー。nginxだと正常にリンクが機能せず、突然404が返ってきたりするので。
nginxの場合は、 "nginx.conf" ファイル内にすべての設定を記述することになっているため、URLリライト処理についても同様に記述する必要があります。nginxの設定についてはここでは触れません。

・DBサーバーインストール(MySQL)
データベースサーバーをインストールして、一通りphpMyAdminが使えるようになる所まで設定しました。うちのサーバーではMySQL8.0が動いているようです。バージョンによってもセットアップ方法が違い、戸惑いました。
今のところ、MySQLは、phpBBとWordPressのために動作しています。自分で直接DBを操作して勉強することもあるかも。あくまでも予定です。

あと、今後やりたいことですが...。

・ufw導入
・GUI環境削除、不要なパッケージの整理
・nginxの設定の見直し
・MySQLデータベースのパーミッション設定の見直し
・その他サーバーのセキュリティの見直し

を、ひとまずインターネット上での公開に先立つ準備として行いたいと考えています。
その後、ドメインの取得を行い、可及的速やかにhttps対応を行いたいかなあという考えです。

それから、公開サーバーの運用に必要となるメールサーバーですが、メールシステムの勉強という意味では、PostfixなどのMTAアプリケーションを自宅のサーバーにインストールするのも面白そうなのですが、ほとんどの個人向けISPからは、TCP25番経由で送信相手のメールサーバーのMTAに直接到達することができません(OP25B)。また、下手な設定のまま運用したりすると、迷惑メールの温床になるなど、色々とマズい事が起きるのかなあという所感です。ちなみにMTAはメールを送受信するだけではなくリレーする事もできるので、迷惑メールをバラ撒くための踏み台にされると良くないですね。
従って、メールサーバーの運用にはVPSを使うことを考えています。自分のドメインのメールアドレスが必要そうだったら、ということですが。

あと、今後やりたいこととして他に考えているのは...

・Rubyインタプリタの導入
・動作確認ついでにRedmineを動かしてみる
・ゆくゆくはMastodonを動かしてお一人様インスタンスやる

という感じでしょうか。
本当はRubyを動かすくらいなら今すぐにでもできるのですが、とりあえず閉域鯖から公開鯖に魔改造してしまう作業が直近では増えそうです。

あと、本来なら潤沢にあるはずの春休み期間を使ってやりたいですが、車のお免許を取得する作業(?)がある関係で、実機のそばでの作業は中々できそうにないです。やるとしても遠隔でSSHして操作することになるかなあ。

その都合上、サーバーの死活対応も問題になってきそうですねえ。サーバーマシンであればIPMIとか生えてるので、サーバーが生きていないときでもネットワーク経由で対応できるんですが、普通のMateにはそんなの生えてないので、サーバーに疎通しなくなったらお手上げですよねえ。何か考えときます。


P.S. サーバーのバックアップ方法について考えてなかった...

2020年8月11日火曜日

NEC Mateを買ってUbuntu 20.04を入れました

じゃーん。最近、NECのMate(MK31M/B-E)をお家にお迎えしました!
Ivy Bridge世代のCore i5-3450が載っていて、メモリは4GB DDR3、DVDスーパーマルチドライブ搭載と、そこそこいい感じのスペック。有効なWindows7ライセンス(Windows 10アップグレード可能)も付属します。ストレージは250GBのHDDと、少し時代遅れ感はありますが、どうせ後で交換するので気にしないことにします。

お値段はヤフオクで3,800円。 送料が2,000円ちょい掛かりましたが、お買い得です。

Mate、かっこいい...。


■ストレージ換装とUbuntuのインストール

このPCには250GBのHDDが搭載されていますが、我が家には旧メインPCから取り出して使わなくなってしまった256GBのSSD(Intel 545s)と、データがたっぷり入った2TBのHDD(WD20EZRZ)があります。せっかくなので、それを搭載することにしましょう。

このPCには、5インチベイ(光学ドライブで占有済み)、3.5インチシャドウベイ、3.5インチFDDベイがそれぞれ1つずつ存在します。うまくいけば、光学ドライブを含めて3台のストレージを搭載できそうです。

ですが、このPCのマザーボードにはSATAポートが2つしか存在しないため、ストレージを3台搭載するのは簡単ではありません。考えられうる対処法としては;
1. 光学ドライブを接続せず、代わりに2台のストレージを接続する
2. ポートマルチプライヤを使い、マザーボードのSATAポートを分岐して使う
3. PCIe to SATA 拡張ボードを使い、SATAポートを増設する
4. ストレージの内蔵をあきらめ、USB接続する
などがあります。
今回は3番の方法を取り、玄人志向から出ているSATA3I2-PCIeという製品を使ってSATAポートを増設しました。ですが結果的には、PCをスリープから復帰させた際に、拡張ボードに繋げたストレージをロストしてしまいアクセス不能になる症状が発生しています。症状の再現性もかなり高めです。こういった相性問題はよく見られることのようで、SATA拡張ボードの使用は、あまりオススメできるものではなさそうです。

これがストレージ換装と増設を終わらせた後の様子(配線は後で修正しています)。右上に、SSDとHDDがベイに1台ずつ搭載されている様子が見えます。
FDDベイにSSDを搭載するのも実は結構苦労していたり。ネジ位置の関係でうまく搭載するのが難しいんですよね。

そういや、このPCにはマザーボード上にPCIe x16スロットが搭載されていません。グラボをつけたい人は気をつけようね。


■Ubuntuのインストール

SSDにUbuntu 20.04 LTSをインストールします。
Ubuntuをインストールするのは、Linux OSの勉強を目的としています。Ubuntuにしたのは、たまたまLiveUSBが手元にあったからですね...数GBにも及ぶディストリビューションをポンポン落とせるほどの回線はなく。
Ubuntuでやりたいことは、基本操作を学んだり、シェルスクリプトに触れてみたり、まあ色々です。メインPCをデュアルブートにするのも考えましたが、使い慣れたWindows PCをそばで起動しておけばいつでも調べ物や作業、学校の課題などで使えるということで、独立したPCにUbuntuをインストールしたいなあと。それがMateを買ったきっかけだったりします。

インストールはそれほど困難ではありませんが、今回はトラブルの連続でした。
このPCはUEFIブートに対応していないので、ブートデバイスはMBRでパーティションを構成する必要があります。ですが、今回UbuntuをインストールしたSSDはもともとGPTでパーティションが構成されていました。そのままの状態でパーティションを全部削除し、パーティションを作り直してレガシーブートできる設定でUbuntuをインストールしましたが、肝心のパーティションテーブルがGPTのままなので、ブートできません。

LiveUSB環境でUbuntuをブートし、GPartedでSSDのデータをHDDにクローニングし、SSDのパーティションテーブルをMBRに変更し、GPartedでHDDからSSDにデータを戻し、Boot Repairでブートローダーを書き込みました。いやあ、大変だった。

本当はもっと効率的な方法もあるかも。

 

■Ubuntu環境のできあがり!

Ubuntu環境、構築できましたー!がんばって作業した甲斐あって、非常に快適に利用できています。
上の画像では、デスクトップ環境としてKDEを入れています。Kubuntuではないです。色々なデスクトップ環境を試してみたく...。

今はまだまだLinux初心者ですが、これから色々勉強していこうかなあと思ってます。基本的なコマンドなんかを少しずーつ覚えている段階です。

Mate、安くてかっこいいのでみなさんも一台いかが?

2020年7月17日金曜日

PCの大幅パワーアップ


じゃーん。買いました。2TBのM.2 NVMeのSSDです。
お値段は3万円をちょっと切る程度。SATAとNVMeで価格差はほぼありませんでした。
SSD、まだまだ高いですが、一昔前に比べて大幅に容量が増えました。

本体はこんな感じ。SSDとしては珍しく、コントローラーの上にステッカーが貼られてなく、丸見えになっています。銀色の大きなチップがSilicon Motion製のコントローラー。中央の小さな黒いチップがキャッシュメモリで、左側の大きな黒いチップが64層3D NAND TLCフラッシュメモリ。


それから、このようなヒートシンクも付いてきました。薄っぺらいですが、これでも多少の放熱効果はあるとのこと。私はまだ使っていませんが...


外箱、本体、ヒートシンク以外には付属品は全くありません。誰も読まない説明書や、扱いに困る保証書などは入っていません。(本当に新品が届いたのか、中古品を掴まされたのではないかと不安になってしまった...)

取り付けた感想ですが、多少は速くなった...ような気がします。SSDからSSDへの移行なのでどうしても速度差が実感しにくいのと、同時にメモリ増設を行ったことや、CPUが動作のボトルネックになっていることもあり、SSDの換装による速度向上効果を実感できていないのが正直なところです。

それよりも、ストレージの空き容量不足が解消された点が一番大きいかな。以前は256GBのSSDを使用していましたが、常に空き容量が20GB以下、ピーク時は空き容量が10GBを切っていたので、非常に使い勝手が悪かったんです。今回、2TBのSSDに移行したことで、何をしても使い切れないくらいの潤沢なストレージを手に入れられました。生産性がとても上がりそう。
今のところ、2TBのうち300GB程度しか使えていません。とりあえず、別のHDDに移してあった写真とかゲームとか、買ってから全然遊んでなかったスッチムゲーとかを入れておきました。

それから、メモリ増設もやりました。
私が使っている富士通SH75/C3は最大12GBのメモリを搭載できますが、メーカー推奨容量をガン無視して人柱になる覚悟で、思い切って32GBのメモリを購入しました。


買ったのは、TranscendのDDR4-2666 32GBx1 SO-DIMMという規格の製品。Amazonで15000円程度と、容量にしてはかなりのお買い得価格。メモリの容量単価もだいぶ下がった印象です。

取り付けると、DDR4-2400として動作しました。マザーボードにはんだ付けされている4GBと合わせて、合計で36GBが利用可能になりました。
メーカー推奨容量を大幅に超えているので動作するか本当に不安でしたが、今のところ不具合もなく安定動作しています。



36GBもメモリがあっても、実際のところ殆ど使いきることはできていません。そこでWindows君が気を利かせているのか、メモリに多くのデータをキャッシュしてくれています(SuperFetch / SysMain)。
これによる効果か分かりませんが、体感上ストレージへのアクセスが非常に少ない気がします。というか、ほとんどアクセスがない。かなり快適です。

PCの増強を終えて、重いゲームとかで色々遊んでみましたが、ストレージやメモリなどによるボトルネックが完全に解消し、CPUがボトルネックになりましたCPUの性能をフルに使い切れる状態となりました。
...ゲームをしていてCPU使用率100%に張り付くことが非常に多いんですよね。メモリに空きがあり、ストレージへのアクセスも少ないにもかかわらず、です。
ボトルネックを解消してCPUの利用効率を高めることが今回の目的だったので、目的は十分に果たせましたが、それと同時に、Core i5-8250Uの性能限界を実感することになりました。

今後機会があれば、高性能なデスクトップPCの自作にもチャレンジしてみたいです。
それから...中古でもいいのでThinkPad欲しいなあ。トラックポイントとか打ちやすいキーボードとかに憧れています。なかなか買う機会がないですが...。

2020年6月27日土曜日

【Arduino】delay関数を使わないLチカ

こんにちは。そろそろ遠隔授業に疲れてきたたかみやです。

みなさんは、Lチカってご存じですか?知らない方はいませんよね(強引)

LEDを点滅させる「Lチカ」は、Arduinoのチュートリアル的存在としても知られています。
新品のAVRにブートローダーを書き込んだ時なんかの動作確認にも用いられますよね

そんなLチカに関してですが、僕は最近、こんなものを書きました。Bloggerへのコードの張り方がわからないので画像で失礼しますが...
これ、なんだか分かります?実はこれも「ただのLチカ」なんです。このスケッチの動作自体は、Arduino IDEのスケッチ例に入っている「Blink」と全く同一です。

delay関数を使わない代わりに、millis関数を使って計時しているのがこのスケッチの特徴です。計時中もloop関数は常に実行されているので、計時しながら別の処理を実行させることができるのも特徴です。

実はこのLチカは、delay関数を使えばこんな風にシンプルに書くことができます。
非常に簡単ですね。
じゃあ、いつもdelay関数を使えばいいのでは...と思うかも知れませんが、そういうわけにはいきません。
delay関数は、指定した時間だけ、(ほとんど)すべての処理を止めてしまう関数です。ms単位で指定するので、引数に1000を指定すれば、1000ミリ秒=1秒間もの間、すべての処理が止まってしまうことになります。
Lチカの場合はLEDを光らせることにしかマイコンを用いていないので無問題ですが、マイコンで様々な情報を処理させたり、複数の表示デバイスを同時に用いたり、スイッチやセンサからの入力をリアルタイムで監視する場合など、delay関数が問題になる場面は多いのです。
そんなわけで、なるべくdelay関数を排除してプログラミングできないか、最近は模索するようにしています。今回のLチカプログラム「Blink_NoDelay」はその一環です。

ちなみに先ほどのLチカですが、pinModeやdigitalWrite関数などをAVR寄りに置き換えるとこういう書き方もできます。名付けて「Blink_NoDelay_HS」。HSは「High Speed」の略で、プログラムの動作を高速化させたという意味合いで付けた名前です。
この手法はマイコンの動作を高速化できる手法として知られていますが、スケッチの容量削減にも一役買ってますね。標準的なblinkスケッチが924バイトもあるのに対し、こちらはコードがゴリゴリ記述されているにもかかわらず、654バイトしかありません。
ちなみに先ほど説明した「Blink_NoDelay」は936バイトと、標準的なblinkスケッチよりもスケッチのサイズが大きくなってしまっています。pinModeやdigitalWrite関数を省いたことでスケッチの容量を削減できたことは明らかです。

ところで、なんでこの期に及んでLチカなんか書いているんだい?と思われるかも知れませんが...
実は実家に帰省していて、ArduinoとPCだけ実家に持って帰ってきたんですが、他の電子部品を全部アパートに置いてきたので、電子パーツを使った工作が全然できない状況なんです。
そのため、他の電子部品を一切使わないようなプログラムを書いたりして、気晴らしをしています。
Arduinoに2次方程式を解かせたり...

Arduinoに5元連立1次方程式を解かせたり...

とにかく色々やって遊んでます。まあ、C言語の練習かな。
2次方程式を解くプログラムはオリジナルですが、連立方程式はQiitaに掲載されていたプログラムをほぼ流用しています。
今までJavaでプログラミングを学んでいたので、C言語は訳が分からなくて苦労していますが、少しずつ慣れていけたらなと思います。

---- おまけ(三角関数を含む総和計算) ----
Arduino、何やってもめちゃくちゃ高速に演算して結果返してくれるので、ヤケクソになって「とにかく時間かかる演算ばかりさせてCPUパワーを消費してやるー!」と思い、こんな計算をさせてみました。この計算はATmega328Pにはしんどいようで、約2.8秒かかるという結果に。ですがよく考えてみると、16MHzのCPUでここまでできれば、まあ優秀ですよね。
ちなみに、計算に使用した数式ですが、以下のサイトで紹介されていたものを利用しました。

2020年6月5日金曜日

秋月のATmega168/328ボードが完成した!


じゃーん!できたー!!!
まともにはんだ付けするのがものすごい久々なので、部品の実装がめちゃくちゃ雑になっちゃいました。各方面から怒られそうなはんだ付けですが、これでも「めっちゃ丁寧にやったつもり」なんです許してください!

組み立てで難しかったのは、はんだ付け前の部品の固定でしょうか。特に1列のピンヘッダーとかピンソケットが動かないように固定するのが難しいです。多分、他の部品を実装する前にまずピンヘッダーやピンソケットを実装してしまったほうが楽に作業できるのではないでしょうか。

組み立てる上でのこだわりポイントは、基板上のLEDの配色です。このキットには元々赤色LEDが4個付属してくるのですが、自分は純正のArduino UNOに合わせて、電源LEDをグリーン、それ以外のLED(Tx, Rx, L)をイエローにしました。LEDのVfが2.1V前後で、数mA程度の電流を流せるものであれば、特になにもしなくてもポン付けできると思います。

このキットを組む上で避けては通れないのが、FuseBitとブートローダーの書き込みです。
FuseBitは、いわばマイコンに対する初期設定のようなものです。マイコンの動作条件などを指定します。ブートローダーは説明が難しいですが、簡単に言えば「Arduinoのスケッチを読み込むための下準備」といった感じです。

これらの初期セットアップをするためには様々な方法があります。
正攻法では、AVRISPmkIIという書き込み装置と、Atmel Studio 7という統合開発環境を使い、PCからマイコンにプログラムを書き込める環境を用意します。ですが、AVRISPmkIIは入手が今のところ困難なようですし、書き込み装置を別途用意するのはお手軽ではありません。
このため、ボードに標準搭載されているUSB-シリアルインターフェース "FT232RL" を使った、Bitbangと呼ばれる書き込み方法がお手軽です。
ですが、個人的にハマった点が、Atmel Studio 7はどうやらFT232RLからのBitbang書き込みには対応してなさそうなんです。悪戦苦闘の末、Atmel Studio 7を使うのは諦めました。

結局のところ、以下のURLで紹介されている手法を用い、AVRdude-serjtagを使ったBitbang書き込みを行いました。
外付けAVRライタ無しでBootloaderを書き込む - kosakalab
Bootloaderファイルは、Arduino IDEをインストールするとついてきます。

また、以下のサイトも参考とさせていただきました。助かりました。

ちなみにこれは耳寄り情報なのですが、既に動作するArduino(もしくはその互換機)を持っていれば、Arduino as ISPという機能を使って、Arduino(もしくはその互換機)同士を接続してブートローダーやスケッチの書き込みができるようです。結構簡単に扱えるので苦労も少ないかもしれません。
そういう面では、このキットは既にArduinoを持っている人が2台目3台目として組み立てるのに向いているとも言えそうです。

完成したキットでLチカをしたり、LCDで遊んでみたりしましたが、それは別の記事として書くことにします。
いやあ、マイコン遊びは超楽しいです。

ATmega328P-PUを最小構成で動かす

最近、空き時間にAVRマイコンで遊んでいるのですが、Arduinoボードのように周辺機器や回路を満載せず、最小構成で動かしたいと感じることがあります。 Arduinoボードには、USB-シリアル変換インターフェース、5Vおよび3.3V定電圧電源、水晶発振子やセラミック発振子、電源...