SDカードが壊れてしまった HDMIセーフモードについては「NOOBS」をインストールしたフォルダ内の「INSTRUCTIONS-README.txt」に記載があります。, これまで挙げた原因以外だとすると、Raspberry Pi本体の故障…ということもあるかもしれません。, 私の場合はHDMIモードで起動できないパターンでした…わかってしまえば単純なのですが、SDカードが壊れた!と思い込んでしまい、ここに辿りつくのにかなり時間がかかりました。いい勉強になりました…。「READ ME」は読むべきですね…。, iTAC_Technical_Documents 前回の番外編1同様、本編(Raspberry Piの操作等)からは少し外れますが、Raspberry Piが突然起動しなくなった時の対処法をいくつかご紹介していきたいと思います。 Produced by iTAC Solutions Lab, iTD_GRPさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog Raspberry Pi 4にRaspbianの初期設定2020年版. 1. (と言いますのも、私の使っているRaspberry Piでディスプレイに何も表示されなくなるという事象が発生してしまったのです…。いざという時の助けになれば幸いです。), 前回起動が成功した時と同様にRaspberry Pi本体にSDカードを差し込み、電源を供給します。, その後、緑のライトが点滅し、SDカードを読み込んでいるようなのですが… 緑のライトが消え、ディスプレイにも何も表示されない…。, 一度電源を外し、もう再度差し込んでみたり、microSDカードも抜いて再度差し込んでみたりしますが、ディスプレイは真っ黒なまま…, 色々と調べてみるといくつかの考えられる原因・対処法が出てきました。 6. Join the global Raspberry Pi community. 今回はRaspberry PiのGPIOピンの概要を確認します。GPIOのピン番号や電気的仕様を確認したあと、GPIOピンにLEDを接続する回路とスイッチを接続する回路を検討します。, Raspberry Piにはプログラムで制御できるGPIOピンは26本あります。プログラムで制御する際、どのGPIOピンを制御するのかを「番号」で指定します。例えば「何番のピンの出力電圧を3.3Vにする」「何番のピンの電圧の状態を読み取る」などです。, この「番号」ですが、Raspberry Piの場合、指定方法が2種類あります。その2種類とは「ピン番号による指定」と「GPIO番号による指定」です。っていっても何のことやら、という感じですよね。Raspberry PiのGPIOを使う際に大前提となる部分ですので、詳しく説明します。, まず一つ目の制御方法は「ピン番号による指定」です。第17回の記事で説明しましたが、Raspberry PiのGPIOピンは以下のように番号が割振りられていることを確認しました。, このピン番号を使って、「何番のピンの出力電圧を3.3Vにする」などと指定する方法が「ピン番号による指定」です。, この指定方法だけで十分な気がしますが、Raspberry Piにはもう一つGPIOピンを指定する方法があります。それは「GPIO番号」による指定です。このGPIO番号について詳しく説明します。, Rasbperry Piの処理の中心となるプロセッサはブロードコム社の「BCM2837」(あるいはBCM2836)というものが使用されています。このプロセッサには非常に多くのピンがあり、その中にGPIOピンもあります。このプロセッサのGPIOピンは53本あります。この53本のGPIOピンのうち、2番から27番の26本がRaspberry PiのGPIOコネクタに接続されています。例えばBCM2837にはGPIO2というピンがあり、これが拡張コネクタの3番ピンに接続されています。, GPIOピンを指定する一つ目の方法は、Raspberry Piのピン番号を指定する方法でしたが、もう一つの方法とはこのプロセッサのGPIO番号を指定する方法なんです。上の例では、Raspberry PiのGPIOピン番号指定は「3番」になりますが、プロセッサのGPIO番号指定は「2番」になります。, 何だかややこしくなってきましたね。どちらかに統一して欲しい気もしますが、それぞれ特徴があります。, Raspberry PiのGPIOコネクタのピン番号指定の場合は、物理的な位置がわかりやすい特徴があります。一方、GPIO番号指定の場合は、番号が2番〜27番の連番になっています。GPIO番号は連番になっているので、プログラムを作る際はこちらの方が便利かもしれません。, ちょっと先の話になってしまいますが、このシリーズ記事の後半ではPythonでGPIOピンを制御します。その際、ライブラリを利用するのですが、プログラムの最初で「ピン番号」で指定するのか、「GPIO番号」で指定するのかの設定をします。その際、Pythonプログラム上では、ピン番号の場合は 「BOARD」、GPIO番号の場合は 「BCM」と指定します。この「BCM」は先ほど説明したプロセッサ名に由来しています。「BOARD」というのはRaspberry Piの基板(本体)のことで、GPIOコネクタを意味しています。, ピン番号で指定する場合は物理的な位置で確認できますが、GPIO番号はどうなっているか外見ではわかりませんよね。以下の表はどのピンがどのGPIO番号かまとめたものです。, GPIOの番号自体は連番になっているものの、配置は結構バラバラですよね。ちゃんと並べてくれればいいのに、という気もしますが、これは仕方ない面もあります。拡張コネクタのGPIOピンは、プロセッサのGPIOピンから配線して接続する必要があります。プロセッサ(BCM2837)は非常に多くのピンがあり、他の配線も多くありますので、拡張コネクタ上に連番で並べようとすると配線が交差してしまいうまく配線できなくなってしまいます。交差を緩和する方法もありますが、そうすると製造コストが高くなってしまいます。ということで、このような配列で決着したのだと思います。, なお、GPIOピンの中でもGPIO2とGPIO3は他のピンと電気的特性が異なるので注意が必要です。具体的には、回路内部で抵抗が接続されていますので、これらのピンを使用する場合、電子回路上問題ないか確認する必要があります。この注意点については、この記事の後半のスイッチを接続するセクションで詳しく説明します。, また、(GPIO番号ではなく)ピン番号の27番と28番の「ID_SD」と「ID_SC」は外部にEEPROMというデータを保存するための部品を接続するピンですが、あまり使用しないと思います。, GPIOピンで出力電圧を制御したり、電圧値を読み取ったりできますが、出力電圧を制御するのか、あるいは電圧値を読み取るのかは、プログラムで各GPIOピンの役割を設定します。Raspberry Piでは、このような出力電圧制御や入力電圧の読み取り以外にも、設定を変えると外部とデータ通信も可能になります。データ通信を行う場合は、データ通信の方式により使用するピンが決められています。, この入門シリーズの範囲を超えた説明になってしまいますが、例えばSPI通信というデータ通信方式があります。このSPI通信では、GPIO番号のGPIO7〜GPIO11の5ピンがこの通信のために専用に割り当てられます。SPI通信を行う場合は、プログラムでSPI通信を行うように設定することになります。, 先ほど説明しました通り、GPIOピンはプログラムの設定で、出力電圧制御ができるようにしたり、入力電圧の読み取りができるようにすることができます。, まず、出力電圧を制御する際の制限です。GPIOを出力電圧制御ができるように設定すると、Raspberry Piの内部の電気的な動作は以下のようになります。, GPIOを出力電圧制御にした場合、このように電流が流れますが、この電流には以下のような制限があります。, 「制限」と書くと、例えばGPIOピンに20mA流れるようなLEDを光らせる回路を接続した場合、GPIOピンから流れる電流は16mAで制限される、という意味に取られるかもしれません。でも実際には、20mA流れるような回路を接続すると20mA流れてしまいます。上の制限とは「この値を超えないように電子回路を設計してください」いう意味になります。, では、上の制限を超えて使用するとどうなるのでしょうか。これはプロセッサ(BCM2837)のGPIOピンの制限ですので、いずれプロセッサがダメになってしまいます。, また、複数本のGPIOピンを使用する場合は、1本のGPIOピンに流す電流が16mA以内であっても、同時に流れる電流の合計は50mAを超えないようにします。GPIOピンは26本もありますので、26個のLEDを光らせることはできますが、それぞれのLEDに流れる電流が2mAでも合計電流は52mAとなりオーバーしてしまいます。, 実際の回路を設計する場合は、上の電気的制限ギリギリに設計しないことです。ギリギリで設計すると、例えば部品のばらつきや温度変化で特性が変わってきますので、動作する環境によっては制限をオーバーしてしまいます。ではどのぐらいを目安にすればよいかというと、だいたい制限値の半分〜7割程度が望ましいです。, Raspberry Piでは、GPIO1ピンあたりせいぜい10mA程度、合計の電流は30mA程度を目安にすると安心です。, GPIOピンで電圧を読み取るようにした場合、Raspberry Piの内部は以下のようになります。, この時、GPIOピンに入力する電圧は、0V〜3.3Vの範囲内にする必要があります。3.3V以上の電圧を加えると、先ほどの電流のケースと同様に、プロセッサがダメになってしまう可能性があります。, なお、Raspberry PiのGPIOピンは電圧値そのものを読み取ることはできず、0Vか3.3Vかのどちらかを読み取ることになります(例えば1.5Vの時に、1.5Vとして読むことはできない)。では、中間の値の時はどうなるのかというと、以下のようになります。, GPIOで電圧を読みとる場合、3.3Vを超えないようにすることも重要ですが、0Vから3.3Vのどちらかをきちんと読み取れるようにすることも大切です。, GPIOピンにLEDを接続して点滅制御する回路を検討してみます。といっても先ほど例としてあげましたので、以下のように接続すればLEDを点滅制御できますよね。, このような回路にすれば、プログラムのGPIOピンのスイッチをONにすると、GPIOピンの出力電圧は3.3VになってLEDが光ります。当然、スイッチをOFFにすればLEDは光りません。(スイッチは実際にあるのではなく、電気的に制御しているだけです), この場合は、スイッチをOFFにするとLEDが光り、ONにすると光りません。これは前回説明したように抵抗やLEDに電位差があるかないかで考えればわかりますよね。, でも下の方は、スイッチの状態とLEDの光る状態が逆なので分かりづらいですよね。Raspberry PiのGPIOピンの場合は分かりやすい上の方の接続で問題ないですが、他の電子回路の場合は下のケースの方が有利な場合もあります。, 上の方は、スイッチをONにするとGPIOピンから電流が抵抗・LEDに流れ出ます。これをソース電流と呼んでいます。(「ソース」は源、出どころ、とかいう意味です), これに対して、もう一方の接続方法は、スイッチをOFFにすると、抵抗・LEDを通してGPIOピンに電流が流れ込みます。これをシンク電流と呼んでいます。(「シンク」は沈み込むなどの意味です), Raspberry PiのGPIOピンの場合、ソース電流とシンク電流の制限は16mAで同じ仕様になっています。でもこの電流はいつも同じとは限らず、他の電子部品(マイコンなど)では、製品によっては、電流制限はソース電流よりシンク電流の方が大きい場合があります。そのような場合、より大きな電流を流すためにシンク電流でLEDを光らせるケースもあります。, GPIOピンを、電圧の状態を読み取るように設定した場合、0Vか3.3Vか(実際のプログラムでは0か1か)を知ることができます。この仕組みを使って、スイッチの状態を読み取ることができます。, スイッチを使ってGPIOピンを0Vか3.3Vにするのは簡単そうですよね。例えばこんな感じです。, このようにすれば、スイッチがONの時、GPIOピンは3.3Vになり、プログラムでこの値を読むと3.3Vが読み取れます(実際は数値として1が読み取れる)。でもこのスイッチの回路は問題があります。スイッチをOFFにすると、GPIOピンはどこにも繋がれていないので、電位が不安定になります。, スイッチがOFFの場合、GPIOピンが0Vになればいいんですよね。ってことで、スイッチがOFFの時に0Vになるように以下のように回路を追加してみました。, でもこのようにするとスイッチを入れた時に問題が発生します。スイッチをONにすると、、、, 電源のプラス側とマイナス側が直接接続される、つまりショートしてしまいます。この問題を避けるためには以下のように抵抗を接続します。, このようにすると、スイッチがOFFの場合はGPIOピンの電圧は0Vになります。ちょっとわかりづらいようでしたら、前回の記事の電位を求めるクイズのM点のところを見てみてださい。同じ回路になっています。, スイッチ回路はスイッチ開放時に電圧が不安定にならないように、このように抵抗を接続します。この抵抗のことを「プルダウン抵抗」と呼んでいます。0Vの方に引っ張って(プルして)、0Vに落とす(ダウン)という意味です。プルダウン抵抗、ということはプルアップ抵抗とかいうのもあるんでしょうか。実はあります。以下の回路がプルアップ抵抗をつけたスイッチ回路です。, この回路の場合、スイッチがONの時、GPIOピンは0V、OFFの時3.3Vになります。ONの時は0Vにつながっていますのでわかると思いますが、スイッチがOFFの時はちょっとわかりづらいかもしれません。まずRaspberry Piに限らず、マイコンなどの入力ピンにはほとんど電流が流れません。, そのため、スイッチをONにした時のGPIOピンの電圧は、前回のK点と同じことになります。, なお、プルダウン・プルアップの抵抗ですが、だいたい1kΩ〜10kΩのものを使用します。この入門シリーズでは1kΩの抵抗を使用します。, ということでスイッチ回路ができました。と言いたいところですが、今回の入門シリーズのスイッチ回路は、安全対策もしておきます。, Raspberry PiのGPIOピンの機能はプログラムで簡単に変更できます。この入門シリーズではスイッチを一つつけますが、もしそのスイッチを接続したGPIOピンを間違って出力電圧制御にしてしまった場合を考えてみます。出力電圧制御の場合、電気的には以下のような回路になります。(出力電圧を0Vにしている場合です), ということでショートしてしまいます。プログラムが動かない時に、いろいろ設定を変えて動作確認するケースなどもあります。その時に気づかないで上のような状況になってしまう可能性もあります。そこで、上のような接続になった場合でも電流が流れ過ぎないように1kΩの抵抗をGPIOピンの入力のところに追加します。, このように抵抗を接続しておけば、この回路でスイッチがONになっても、電流はあまり流れません。1kΩの抵抗を使いますので、電流 = 電圧 ÷ 抵抗 = 3.3 ÷ 1k = 3.3mAです。3.3mAであれば間違ってスイッチをずっと押したままでも何も問題はありません。, この回路でスイッチをONにした時とOFFにした時は、前回の電圧を考える回路のP点とQ点と同じになります。, 一番最初のGPIOのピン番号の説明で、GPIO2とGPIO3は内部で抵抗が接続されている、と説明しました。具体的にどうなっているのか確認してみます。, ちょっとわかりづらいかもしれませんが、今までの知識があればこの回路図は読めるようになっていると思います。中央にある黒い四角が2列あるところがGPIOピンです。3番ピンと5版ピンはGPIO2とGPIO3ですが、内部回路を見ると、1.8kΩの抵抗で3.3Vの電源に繋がれています。GPIO2とGPIO3は1.8kΩの抵抗が接続されていることがわかります。この理由ですが、GPIO2とGPIO3はI2Cというデータ通信にも使われるピンで、このデータ通信を行う場合、この2つの信号線は抵抗を接続する必要があります。そのため、もともとRaspberry Piの回路側で抵抗が接続されています。, この回路はスイッチがOFFの状態ですが、入力電圧の値は0Vではありません。この回路を書き換えると、以下のようになります。, 詳しい計算は省略しますが、この回路の電圧は、約1.74Vになります。電圧の読み取りは以下のようになっていました。, 1.74Vの場合、3.3Vとして読み取られてしまいます。つまり保護抵抗をつけたスイッチの回路はこのままGPIO2とGPIO3には接続できないことになります。実際にこのような回路を作った場合、スイッチをONにしてもOFFにしても3.3Vとして読み取られてしまいます。, 今回はプルアップ・プルダウン抵抗を用意しましたが、Raspberry Pi(プロセッサのBCM2836/2837)ではソフトウエアでプルアップ・プルダウン抵抗を設定できます。これはRaspberry Piに限らず、一般的なマイコンなどでも同様の機能を持っています。, 内部のプルアップ・プルダウン抵抗を設定すればスイッチを直接GPIOピンに接続しても問題ありませんので、部品点数を減らすことができます。ただ、その場合でも先ほどのようにGPIOの設定を出力電圧制御にした場合、ショートが発生するリスクがあります。, 内部のプルアップ・プルダウン抵抗は、電子回路設計に慣れてきてからトライしてみてください。. (それがちょっと大変だったりしますが). Hardware : Raspberry Pi 3 Model B OS : RASPBIAN JESSIE WITH PIXEL January 2017 (Kernel version 4.4) 前提. ?、って感じですよね。実際に動かしてみたほうが早く理解できますので、理屈は置いておいて実際に動作させてみましょう。, というファイルがありますので、このファイルの中身に0を書き込むとGPIO21ピンがOFFに、1を書き込むとGPIO21ピンがONになります。またこのファイルの中身を読み取ることにより、現在のピンの状態(0か1か)がわかります。, ファイルを読み書きしてGPIOピンを制御できるというのは、なんだか不思議な感じがします。でも直接メモリを読み書きすることを避ける方法としては面白いアイデアですよね。, GPIOピンを制御するには、GPIO21ピン(晴れ用のLED接続ピン)であれば /sys/class/gpio/gpio21/value に値を書き込めばよいわけですが、書き込みを行うにはエディタではなく「echo」コマンドを使用します。このechoコマンドについて簡単に説明しておきます。, そもそもこのechoコマンドはファイルに書き込む目的のものではなく、文字列を表示するコマンドなんです。, それではechoコマンドの基本的な使い方を確認しておきましょう。ターミナルアプリから、以下のコマンドを入力してリターンキーを押します。, 「echo」とは日本語で「真似する」とか「反響」という意味ですが、この意味の通りechoコマンドはパラメータ(上の例では「Hello」という文字列)を表示する機能を持っています。一見、何目的かわからないコマンドです。でも第12回で説明した「リダイレクト」機能を使うとファイルに書き込むことができます。, 第12回の説明では、リダイレクトを使ってlsコマンドの結果をファイルに出力する練習をしてみましたよね。このechoコマンドにリダイレクトを組み合わせると、lsコマンドの時と同じように表示結果をファイルに出力することができます。簡単な例で復習しておきましょう。リダイレクトはコマンドの後に “>”を書いて、その後にファイル名を書けば結果をファイルに出力できます。, 実際に Hello という文字がtest.txtファイルに書き出されているか確認してみましょう。ファイルの中身を表示するためにここでは「cat」コマンドを使用します。, もうおわかりだと思いますが、Raspberry PiのGPIO制御はこのechoコマンドを使ってパラメータを先ほどのファイル(/sys/class/gpio/gpio21/value)に書き出すことになります。, このようにRaspbianではechoコマンドを使用してGPIOのON/OFF制御ができますが、実際にechoコマンドでGPIOを制御するには前準備が必要になります。, このような結果になると思います。これから /sys/class/gpio/gpio21/ にある value というファイルを操作したいのにそのファイルがありませんよね。, このシリーズの第2回で説明しましたが、GPIOピンは出力機能にしたり、入力機能にしたり、いろいろな機能をプログラムで設定することができることを説明しました。, 上のように /sys/class/gpio/gpio21/ がないのは、GPIO21ピンの機能を設定していないためなんです。GPIOピンを制御するには、最初にGPIOピンをどのような機能として使うのかを設定して、その後にファイルに書き込んだりして制御します。, なお、最後の「使い終わったよ」宣言をしないで電源をOFFにした場合、初期状態にリセットされます。, それではこの手順に沿って、実際に晴れ用のLEDが接続されているGPIO21ピンを制御してみます。, まず「GPIO21ピンを使うよ」って宣言します。この宣言は、/sys/class/gpio/exportというファイルにGPIO番号を書き込みます。, これでGPIO21ピンを制御できる準備ができました。でも何も反応がないのでちょっと不安ですよね。それでは実際に先ほどの/sys/class/gpio/ディレクトリを見てみましょう。, という感じでgpio21ディレクトリが生成されています。ついでですので、この生成されたgpio21ディレクトリの中身もみておきましょう。, この後は、GPIO21ピンを出力制御をするのか入力読み取りをするのか設定します。具体的にはgpio21/directionファイルに入力か出力かを書き込みます。入力の場合は「in」、出力の場合は「out」を書き込みます。, あとは、/sys/class/gpio/gpio21/valueファイルに0か1を書き込めばGPIOの出力制御ができます。まずは点灯させてみます。, こんな感じで点灯しましたでしょうか。うまく点灯しない場合は回路接続、入力したコマンドなどをもう一度確認してみてください。次にLEDを消灯してみます。, このようにRaspbianではファイルシステムを使ってGPIOピンを制御する方法が提供されています。, 先ほどのechoコマンドによる制御はファイルシステムを通してGPIOを制御していましたが、コマンドで制御できる「Wiring Pi」というライブラリ(オープンソース)があります。Raspbian Stretchではデフォルトでインストールされていますが、Stretch-Liteにはインストールされていません。, そこで、リモート接続タイプの場合のみ、以下の手順でWiring Piをインストールします。, 次に、以下のコマンドを入力してWiringPiのパッケージをインターネットから取得します。, 30秒程度で取得が終わると思います。取得できたら以下のコマンドを入力してWiringPiのパッケージをインストールします。, といきたいところですが、gpioコマンドでGPIOピンを制御する際のGPIO番号の指定方法は3通りあるのでその指定方法から確認します。, このGPIO番号の指定方法はgpioコマンドを入力する際にオプションで指定します。指定方法は以下になります。, 今まで物理的なピン番号とGPIO番号は何回も出てきました。Wiring Pi番号はWiring Piライブラリ独自の指定番号で、ピン番号ともGPIO番号とも異なります。どのピンがどの指定方法で何番かわからなかったら、gpioコマンドで確認できます。gpio readallと入力すると指定番号が表示されます。, この表で、真ん中の “Physical” は物理ピン番号、”wPi”はWiring Pi番号、”BCM”はGPIO番号になります。この入門シリーズでは、GPIO番号を使用しますので、gpioコマンドには -g オプションをつけて使用します。, gpioコマンドを使用してGPIOの出力制御するためのgpioコマンドの使い方は以下になります。, それでは実際に試してみます。今度は曇り用のLEDを制御してみます。曇り用のLEDはGPIO20ピンに接続していますので、GPIO20ピンを出力モードに設定します。, 残りのLEDの点灯も同様に確認してみてください。雨用、雪用、鉄道運行状況表示用の赤、緑、青の点灯が確認できればLED関連の接続は全てOKです。確認する際、もし興味があれば、Wiring Pi番号での指定、物理的なピン番号での指定も試してみてください。, 次のスイッチの状態を読み取ってみましょう。先ほど、echoコマンドでvalueファイルに1か0を書き込むと出力制御ができましたが、スイッチの状態を読み取るにはvalueファイルの中身を表示すればわかります。ファイルの中身は、具体的にはGPIOピンが3.3Vの場合は1、0Vの場合は0になります。この中間の値の時は、第12回で説明したGPIOの電気的特性に従います。, 先ほど説明したGPIO制御手順に沿って作業してみます。スイッチを接続したGPIOピンはGPIO18ですので、このGPIOをこれから制御します。, これでvalueファイルの中身を確認すれば、その時点のスイッチの状態がわかります。スイッチはプルダウン抵抗をつけましたので、スイッチを押した時は1、はなした時は0になります。, なお、valueファイルの中身を表示するコマンドは catコマンドを使用します。まずはスイッチを押さないで読み取ってみます。, 0が表示され、スイッチが押されていないことがわかります。次に、スイッチを押したまま、valueファイルの中身を確認します。上矢印キーで先ほどのコマンドを呼び出して、リターンキーを押す時にスイッチを押しておいてください。, 今度は1って表示されましたよね。ということで、このようにGPIOの値を読み取ればスイッチの状態がわかります。, gpioコマンドを使用してGPIOの入力を読み取るためのgpioコマンドの使い方は以下になります。, それでは実際に試してみます。GPIO番号で指定しますので -g オプションを忘れずに。, もし動かなかったりわからないところがありましたらコメント欄かお問い合わせフォームでご連絡いただければと思います。, 次回はPHPやPythonのプログラムでLEDの点滅制御、スイッチの読み取りをしてみます。ここまで確認できれば、あとはネットから天気予報情報と鉄道運行状況を取得してLEDを点滅させるだけです!