20210427のMySQLに関する記事は4件です。

生産現場IoTへの挑戦 #05 ~データベースのインストールと設定~

1.はじめに I2C接続のセンサーを使用してデータが取れる様になり、全体システムのおぼろげながら構想もできましたので、データの蓄積方法を決めます。 ネットの記事などを見渡すと、IoTのデータはクラウドを活用して収集や集計を行うのが流行りだし格好いいと思うのですが、「クラウドって何となく怖い」とか「クラウド使うお金がない」とか「社外にデータを持ち出すなんてまかりならん」とか「そもそも外部サーバを使っていいものかどうか判断できる人がいない」とかいろいろな理由で社内でコンパクトにシステムを組みたいという場合は、センサー制御用のラズパイにデータベースを構築してしまうという手があります。 (状況が許すならこんなのやこんなのを使って、流行りのかっこいいクラウドIoTをやってみたいものです) プロの方が見たら信頼性の低いラズパイにデータを蓄積するなんて!!! とお怒りの言葉をいただきそうな気もしますが、まずは手軽にIoTを体験するための方便だということでお許し願いたいと思います。 同様のシステムにトライしようという奇特な方がいらっしゃっても、あくまでもIoTの味見をするための簡易システムであり、不測の事故によりデータが無くなる危険があることをご理解ください。 また、データベースの初期設定等について説明しますが、データベースについては今回の案件で触り始めた超初心者でのすの間違いや不適切な使用方法もあるかもしれません。 データベースの使用方法については他の解説サイトや書籍にてより詳しく勉強し、当記事の間違いなどをやさしく指摘していただけると幸いです。 2.MariaDBをインストールする。 前回も軽く触れましたが、使用するデータベースソフトはMariaDBというMySQL互換のフリーソフトです。 これをインストールして、必要なデータベースの設定を行います。 2-1.インストール方法 MariaDBのインストールはターミナル上から行います。 次のコマンドでインストールしてください。 $ sudo apt-get install mariadb-server 2-2.リモートでのログインを許可する MariaDBの設定は次項で説明する通り、リモート環境で実施しますのでネットワーク越しにアクセスできる様に設定しなければなりません。 設定についてはこちらのページで丁寧に説明されていますのでこの通りに実施して下さい。 メモとして必要なコマンドのみ記載します。 $ sudo mysql -u root MariaDB [(none)]> USE mysql; MariaDB [mysql]> UPDATE user SET plugin='' WHERE User='root'; MariaDB [mysql]> exit $ sudo systemctl restart mysql $ mysql -u root MariaDB [(none)]> update mysql.user set password=password('パスワード') where user = 'root'; MariaDB [mysql]> exit $ sudo systemctl restart mysql ※パスワードは、任意のパスワードに書き換えてください。 3.データベースの開発環境について ラズパイ上で使用するデータベースにはMariaDBを使用しますが、データベースを構築する際にラズパイ上で行うと結構厄介です。そこでデータベースの構築中はラズパイをLANに接続してWindows10マシンからリモートで構築します。 3-1.HeidiSQLについて HeidiSQLはWin10上で動くデータベース管理用のGUIソフトです。 MariaDBは、リモートログインを許可した際に用いたSQLと呼ばれる言語で制御できますが、毎回SQLを使うのはなかなかの苦行です。 HeidiSQLを使うと、GUIでデータベースの構築や設定、蓄積したデータの閲覧、出力ができるため非常に便利です。というか、私はGUIツールが無いとデータベースを扱える気がしません。 ラズパイ上で使用できるGUIツールもなくは無いのですが、いくつか試した中ではHeidiSQLが最も使いやすかったので今後の説明はHeidiSQLをメインに使用して説明します。 HeidiSQLの弱点は、ラズパイ上で動かせないことですが、同じLANに接続していればリモートアクセスも容易です。 ※Win10アプリをlinux上で動かすツールを使えばHeidiSQLも使えそうではありますが、まだ試していません。うまく動いたら報告します。 3-2.HeidiSQLをインストールする HeidiSQLはこちらの公式サイトからダウンロードできます。 インストールも特に問題ないと思いますが、こちらのサイトで丁寧に説明されているため判らない場合は参考にしてください。 4.データベースを作成する HeidiSQLがインストールできたら、ラズパイに接続してデータベースを作成します。 4-1.ラズパイのIPアドレスを確認する ラズパイの画面上部にあるネットワーク接続のアイコンをマウスオーバーするとIPアドレスが表示されます。 もしくはラズパイのターミナルを立ち上げてifconfigコマンドで接続状況を確認します。 inetに続く表示がIPアドレスです。 4-2.MariaDBに接続する HeidiSQLを立ち上げるとセッションマネージャーが開きますので接続設定を入力します。 4-2.データベースを作る MariaDBに接続したデータベースが表示されるため、右クリックして「新規作成」⇒「データベース」を選択します。 ウィンドウが開いたら、名前を入力して「OK」をクリックすると新しいデータベースが作成できます。 4-1.テーブルとカラムを作る データベースの中に、データを格納するテーブルを作成します。 先ほど選択したデータベースを右クリックし、「新規作成」⇒「テーブル」を選択します。 画面右にテーブルが表示されるため、テーブルの名前を入力し、カラムを追加します。 今回はBMP280の温度、気圧、湿度を記録するため、IDと時間を加えて5つのカラムを作成します。   4-2.カラムの設定を変更する カラムには様々なデータが記録できますが、記録するデータに合わせて入力規則を定義します。 今回は「名前」「データ型」「NULLを許可」「デフォルト」を下の通り設定します。変更したいセルをクリックすると変更できます。 ※今回はトラブル防止のため、測定時間を記録するカラムにDATETIME型、測定データを記録するカラムにDOUBLE型を使用していますがデータサイズを削減したい場合はTIMESTAMP型とFLOAT型でも対応可能です。 また、timeのカラムだけでもユニークになる予定ですが、役に立つかもしれないのでIDを用いてキーにします。 4-3.キーを設定する データベースを管理するために、キーとなるカラムを設定します。 「INDEX」タブを選択して、「追加」するとキーができますので、「タイプ/長さ」の「KEY」をダブルクリックして「PRIMARY」に変更します。 キーの表示が「PRIMARY」に変わるため、IDカラムを「PRIMARY」にドラッグするとIDが追加されます。 最後に「保存」をクリックするとテーブルができました。 5.まとめ 駆け足でしたが、ラズパイにデータベースを作成しました。 測定項目が増えても同様の手順でカラムやテーブルを増やしていけば記録できます。 最初は戸惑うことも多いかと思いますが、どんどん触って慣れましょう。 6.おまけ・・・ラズパイデータベースの破損について 冒頭にも書いた通り、ラズパイにデータベースを構成することにはデータ破損の危険性が伴います。ラズパイを用いたIoTシステムには常に付きまとう問題ですが、メインストレージにmicroSDのデータ破損に伴う事故が多いようです。 個人的な見解としては、このタイプの事故の最大の原因はmicroSDへの書き込み途中の電源遮断です。配線抜け、電源ブチ切り、工場の停電・瞬停などにより書き込み中に電源が落ちてmicroSDのデータが破損するようなケースです。 この対策としては次のいずれかの方法が有効です。  ①microSDカードをROMモードで使用する。  ②UPSを使用して、電源遮断時に安全にシャットダウンする。 今回は、データベースとして使用するため、microSDをROMモードで使用することはできず、②の対策が必要です。また別の機会にご紹介したいと思いますが、ラズパイ向けのUPS装置が市販されていますので、データ破損対策として導入されることをお勧めします。 ※ちなみに当記事を執筆している現在、ノーガードで運用中ですがなんとか耐えています。。。  UPS自作基板をいただいたのですがまだ手をつけられていません。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLをインストール(Mac編)

記事を作成した背景 プログラミングを独学されている方や、コーチングの際、簡単なWebアプリケーションを作ってみたい! という時に、やはりDBを使えた方ができる範囲は広くなります。 その際、必要最低限のことだけをまとめた記事が無かったので、 簡単なWebアプリケーション作成に際し、必要最低限の内容をまとめてみました。 概要 MacにMySQLをインストール手順を紹介します。 いろんな言語・フレームワークでWebアプリケーションを作成する際、 データベース(以下、「DB」)を使用する場面が多いと思います。 本記事では完全初心者の型がWebアプリケーションを作成する際に最低限必要なMySQLのインストール方法を記事にしました。 ターミナルの起動の仕方からお伝えするので、完全初心者の方もご安心下さい。 1. ターミナル起動編 まずはMySQLのインストールのためにターミナルを起動します。 ターミナルの起動方法は「Command + Space」を押し、Spotlight検索を呼び出します。 そこで「ターミナル」と入力し、 「Enter」キーでターミナルが起動します。 いかにもエンジニア!っぽい画面が立ち上がってテンション上がってきましたね! また、Spotlight検索はアプリケーション立ち上げのショートカットとして便利なのでぜひ活用して下さい! それでは続いてここにコマンドを入力して、更にエンジニアっぽいことをしていきましょう! 1. MySQLインストール編 先程立ち上げたターミナルにコマンドを入力し、MySQLをインストールします。 # MySQLインストールコマンド brew install mysql 2. MySQL起動編 インストール完了まで少し時間がかかりますが、無事完了したらインストールしたMySQLを起動します。 このコマンドは、PC立ち上げ時等、MySQLにアクセスする際は毎回実行する必要があるのでぜひ覚えておいて下さい。 # MySQL起動コマンド mysql.server start 以下のように表示されたら起動成功です! ちなみに、MySQL停止コマンドは以下になります。 # MySQL停止コマンド mysql.server stop 3. MySQLログイン編 MySQLの起動が完了したら、MySQLにログインしてSQLを実行できる状態にします。 # MySQLログインコマンド mysql -u root 無事ログインできたら、ターミナルの行頭に以下のように「mysql」という文字が表示されていると思います。 合わせて簡単にコマンドの説明もしておきます。 「mysql」コマンドに続く「-u」はユーザ名を指定してMySQLへログインするオプションになります。 続く「root」はMySQLインストール時に最初から用意されているユーザです。 ただ、「root」ユーザはとても強力な権限を持っているので、 普段からこのrootユーザでログインして作業をするのは、 大事な設定を間違えて上書きしてしまったり等ヒューマンエラーが発生する可能性が出てきてしまいます。 そこで、通常は、作業用に最低限の権限を付与したユーザを作成し、そちらでログインをして作業する形になります。 MySQLをインストールした直後は「root」ユーザしか用意されていないため、 ここから必要なDBを作成し、そのDBを操作する権限のみを付与したユーザを作成します。 4. 簡単な用語紹介 ここから新しくDB、テーブル等を作成していく上で、必要最低限の5つの用語を簡単にご紹介しておきます。 これ以降、下記5つの単語が記事内に出てくるので、わからなくなったら適宜ご参照下さい。 ※触りの説明だけなので、詳しく知りたい方はGoogle先生へ! ●データベース テーブルの集合体を表します。 Excelで例えると、これがExcelファイル自体になります。 ●テーブル レコードの集合体を表します。 実際にデータを格納するもので、 Excelで例えると「シート」になります。 「シート」の中に実際の値を格納していきますよおね。 ●レコード テーブルの中身を表す言葉で、イメージとしては「行」になります。 ●カラム テーブルの中身を表す言葉で、イメージとしては「列」になります。 ●フィールド テーブルの中身を表す言葉で、レコード(行)とカラム(列)が重なった場所になります。 Excelで例えると「セル」ということになります。 5. DB作成 それではMySQLのインストール、起動、5つの用語を覚えたところで、実際にDBを作成していきます。 まずは作業するためのExcelファイルを作成する、というイメージですね! 下記コマンドで「testdb」という名前のDBを作成します。 -- 構文: CREATE DATABASE `{DB名}` DEFAULT CHARACTER SET {文字コード}; CREATE DATABASE `testdb` DEFAULT CHARACTER SET UTF8; 6. ユーザ作成 DBの作成が完了したので、ここでrootユーザの出番は終了します。 ここからは新しく「testdb」を操作する権限だけを持ったユーザに切り替えていきます。 ユーザ作成は下記コマンドになります。 -- 構文: CREATE USER '{ユーザ名}' IDENTIFIED BY '{パスワード}'; CREATE USER 'user01'@'localhost' IDENTIFIED BY 'testpassword'; ユーザ名部分が少しわかりにくいかもしれませんが、 「user01」がログイン時に使用するユーザ名で、「testpassword」部分がパスワードになります。 それでは先程作成したユーザに「testdb」を操作する権限を与えていきます。 -- 構文: GRANT {付与権限名} ON `{対象DB名}`.* TO '{権限付与ユーザ名}'; GRANT ALL ON `testdb`.* TO 'user01'@'localhost'; 付与権限名に「ALL」を指定しているので、 今回は「testdb」に対する全ての権限を「user01」に与える形になります。 それでは無事ユーザの作成と権限付与が完了したので、 現在ログイン中のrootユーザからログアウトし、新しく作成したuser01でログインを行います。 ログアウトコマンドはこちらになります。 exit ログアウトが完了したら、user01でログインします。 mysql -u user01 -p 上記コマンドを入力するとパスワードを聞かれるので、先程ユーザ作成時に指定したパスワードを入力します。 testpassword これで無事user01にログインができました。一安心ですね。 7. テーブル作成 それではDB及びユーザの作成・切り替えが完了したので、テーブルを作っていきます。 ※イメージとしては、Excelファイル自体の作成はできたので、今からその中にシートを作っていく、という流れになります。 まずは今から操作するDBを指定してあげる必要があります。 use `testdb` これで以降実行するクエリはtestdbを対象としたものになります。 他のDBを操作したい場合は、再度「use」文を使用すれば切り替えられます。 では、テーブルを作成していきます。 ※先程までと違い長い構文なので、 一度テキストエディタに記述し、それをターミナルにコピペする方法がやりやすいと思います。 CREATE TABLE `books`( `id` INT PRIMARY KEY AUTO_INCREMENT, `title` VARCHAR(255) NOT NULL, `author` VARCHAR(64) NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); 長い構文ですが、1つずつ簡単に説明していきます。 まず今回作成するテーブル名は「books」になります。 本の情報を格納するテーブルを想定して作成しました。 続いて「id」〜「updated_at」行まで、これらがカラム(列)になります。 なのでExcelで例えると、1行目に見出しを作成するイメージになります。 見出しは作成できましたが、その中に実際に入れるデータはどんな形式なのかをあらかじめ指定してあげる必要があります。 それがINTやVARCHARとなります。 こちらはプログラミング言語の変数と同じイメージで大丈夫です。 型の種類や詳細が知りたい方は公式ドキュメントをご参照下さい。 それでは今回指定したカラムについて1行ずつ見ていきます。 ●idカラム `id` INT PRIMARY KEY AUTO_INCREMENT 主キー(PRIMARY KEY)になります。 MySQLのテーブルは、レコードごとに必ず一意(ユニーク)になる値を格納してあげる必要があります。 Excelでいうと画面左側に連番で続いてる数字ですね! なのでINTの型の指定のあと、「PRIMARY KEY」を記述しています。 さらに続けて「AUTO_INCREMENT」と記述しているのは、 このテーブルにデータを格納した際、自動的に連番で一意(ユニーク)な数字を採番してくれる設定になります。 Excelのシート画面では、予め画面左側に数字が連番で採番されていますが、 「AUTO_INCREMENT」の場合、1行新しく書き足していく度に勝手に数字が採番されていく、というイメージになります。 ●titleカラム `title` VARCHAR(255) NOT NULL 本のタイトルを保存するために用意しました。 当然数字ではなく文字列になるので、「VARCHAR」を指定しています。 その後ろの(255)というのは、格納する文字列のサイズを予め指定しています。 ●authorカラム `author` VARCHAR(64) NOT NULL, 本の著者を保存するために用意しました。 titleに比べそこまで長い名前の方はいないであろう、ということでサイズは(64)を指定します。 ●created_atカラム `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, MySQLのテーブルにもたせておく慣例のカラムです。 そのレコードの作成日時を格納します。 「DEFAULT CURRENT_TIMESTAMP」というのは、レコード作成時に自動的に現在日時が保存される設定になります。 これでプログラム側でいちいち現在日時を取得して挿入しなくても良いので、とても便利ですね! ●updated_atカラム `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE created_at同様、MySQLのテーブルにもたせておく慣例のカラムです。 そのレコードの最終更新日時を格納します。 「DEFAULT CURRENT_TIMESTAMP」まではcreated_atカラムと同様ですが、 続いて「ON UPDATE CURRENT_TIMESTAMP」という文が続いています。 これはレコード更新時に自動的に現在日時が上書きされる設定になります。 こちらもプログラム側でいちいち制御しなくて良いので、とても便利ですね! 今回は5個のカラムを持つテーブルを作成しましたが、 これが10個になろうが2個だろうが構文に変わりは無いのでご安心下さい。 以上でテーブルの作成は完了しました! まとめ これで一旦、DBを作成し、中にテーブルを作成するところまで学びました。 おめでとうございます! この後は、プログラム側でORMを使用して実際にテーブルにデータを出し入れする流れになります。 本記事は学習用の簡易Webアプリケーションを作成する際のDB接続の最初の一歩のための記事になります。 本当はもっと細かいお話が色々ありますが、学習時に大事なモチベーションを保ったままでいただきたいので、 極力ややこしい話は割愛しておりますのでご了承下さい。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

トランザクション管理 Locking in mysql

トランザクション管理で色々迷ってました。mysqlの仕様を確認して、SELECT ... FOR UPDATEの理解できた! 例えば:こちらのシナリオで問題を確認して、トランザクションを直します。 シナリオ 1. try block // 処理「A」:↓ // 未出荷のデータを確認して、csvファイルにダウンロードする // csvファイルデータダウンロードできたら、注文ステータス→PRE_SHIPPINGに更新する SELECT * FROM orders WHERE status = 'NOT_SHIPPED' AND order_id IN (1,2) FOR UPDATE; 2. 上記のクエリを実行する、クエリ実行でレコードがロックされる、(処理終わるまでロックされるか?) 3. まだPRE_SHIPPINGの状態です、別処理「B」で上記のレコードを更新できた!なんで?(SHIPPIED...) 4. 該当の注文関係の色々データをcsvファイルに出力するデータを作る、select ...  5. CSVファイルをダウンロードする→DL済 6. BeginTransaction(), 処理「A」で注文情報UPDATE処理する(データの整合性大丈夫?) 7. commit 8. catch block 上記のシナリオでなんでロッグされたレコード更新されたか、データの整合性の問題が発生しました。 Note 「Locking reads are only possible when autocommit is disabled (either by beginning transaction with START TRANSACTION or by setting autocommit to 0.」 注記↓ SELECT FOR UPDATE を使用した更新対象の行のロックは、 START TRANSACTION でトランザクションを開始するか、autocommit を 0 に設定することで、自動コミットが無効になっている場合にのみ適用されます。自動コミットが有効になっている場合は、指定に一致する行がロックされません。 参考:Locking Reads(MySql5.6) https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html DBのautocommitを確認する、以下のクエリを実行してみました。 SHOW VARIABLES WHERE Variable_name='autocommit'; |Variable_name | Value| |autocommit | ON | 上記の処理「A」と「B」の実行シナリオにBeginTransactionの場所を直します。 シナリオ(トランザクション管理修正後) try block BeginTransaction() // 処理「A」 // 未出荷のデータを確認して、csvファイルにダウンロードする // csvファイルデータダウンロードできたら、注文ステータス→PRE_SHIPPINGに更新する SELECT * FROM orders WHERE status = 'NOT_SHIPPED' AND order_id IN (1,2) FOR UPDATE; 上記のクエリを実行する、クエリ実行でレコードがロックされる、(トランザクション終わるまで別処理で更新できない状態になった) この間、別処理「B」で上記のレコードを更新する、更新できないです!(処理待ちの状態になる) 該当の注文関係の色々データをcsvファイルに出力するデータを作る、select ...  CSVファイルをダウンロードする →DL済 処理「A」で注文情報UPDATE処理する(データの整合性 OK!) commit  処理「B」ここで実行される、クエリの条件にヒットしないかも、(処理Aで色々更新できた) catch block Thank you for reading!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

生産現場IoTへの挑戦 #04 システムの構成と簡単なテスト

1.はじめに 前回までの開発で、M5StickCを振動ピックアップとして利用できそうなことがわかりましたので、他にも測定したいデータ項目を整理して、全体のシステム構成を考えてみました。 あわせて、センサー類との通信に使用するI2C接続のテストと、測定時間を正確に記録するためのリアルタイムクロックの設定を行います。 2.システム構成のイメージ 前回までは振動センサーについて述べていましたが、実際に運用するシステムはもう少し欲張りな仕様となっています。 2-1.そもそも何がしたいのか? 今回の目的はプラスチック成型機の設備稼働状況の監視で、測定したいデータが複数あります。 設備稼働状況というと、生産管理に結びつくような生産状況情報(何を何個作ったとか、生産条件のトレンドデータなど)のイメージもありますが、今回は設備の故障や不具合を感知することが目的ですので、ユーティリティー関連の状態監視が目的です。 測定項目(予定) 測定対象 測定項目 センサー  センサー出力 環境 雰囲気温度 BMP280 I2C 環境 湿度 BMP280 I2C 環境 気圧 BMP280 I2C 油圧ポンプ 振動 M5StackC BTシリアル通信 油圧ポンプ 回転数 M5StackC BTシリアル通信 油圧ポンプ 瞬時電力 電流センサ アナログ電流 油圧ポンプ 瞬時電力 電流センサ アナログ電流 油圧ポンプ 瞬時電力 電圧センサ アナログ電圧 油圧ポンプ 圧力 圧力センサ アナログ電流 冷却水系統1 水温 熱電対 アナログ電圧 冷却水系統1 流量 流量計 アナログ電圧 冷却水系統2 水温 熱電対 アナログ電圧 冷却水系統2 流量 流量計 アナログ電圧 高圧エア 圧力 圧力センサ アナログ電圧 油圧ポンプ 圧力 圧力センサ アナログ電流 とりあえずいろいろ上げましたが、まずは環境の3パラメータとテスト済みの振動系のデータ採取から開始します。 他の項目はセンサー類の準備ができ次第順次追加することにしました。 2-2.システムの構成 今回はクラウドを使用しないことを宣言しましたが、そもそも測定現場にネットワーク環境が無いことも考えられる、というか今回のプロジェクト先ではネットワーク環境が無いため、スタンドアロンでも稼働することを前提にしています。 全体の構成は上図の通りです。 各種センサーとラズパイはBluetooth及びI2Cで接続します。環境センサーはBMP280というセンサーをI2C接続で使用します。また、今回はアナログ出力センサーを多く使用するためADS1115Sというアナログデジタル変換ボードを使用してラズパイとI2C接続します。ADS1115Sは4chのアナログ入力を持っていますので、必要に応じて追加します。ADS1115Sは一つのI2Cバスに最大4個まで接続できます。4×4=16個以上のアナログデータを入力したい場合もI2Cバスを変えるかI/Oエキスパンダー使用すれば接続数を増やすことが(たぶん)できますのでどんどんデータ測定しましょう。 DS3231はリアルタイムクロック(RTC)機能を追加するためのボードです。RTC機能を持ったPCは電源がオフになっても内蔵電池などで時計機能を維持しますが、ラズパイにはRTC機能がありませんので、ネットワーク接続の無い状態で電源を切ると時計が狂います。今回は時系列データを取ることが目的ですのでRTC機能を追加しています。 2-3.接続に関する注意点 このシステムは、I2CとBluetoothシリアルによる接続を前提としていますが、どちらもノイズや障害物、距離などの環境により接続が不安定になります。 I2C接続の場合、特別な対策をしない限り数十センチが目安です。Bluetoothは見通し無かったり、周囲に電磁波のノイズが多いと接続が不安定になります。 アナログ信号も電流出力の場合は比較的遠距離まで対応できますが、電圧出力の場合は信号線の抵抗によりデータが狂いますので注意が必要です。 3.データベース 測定したデータは、データベースに記録します。 CSVなどのファイルに保存することもできますが、膨大なデータをCSVファイルで管理するのは至難の業ですので、データベースによるデータ管理に挑戦しました。 使用したデータベースソフトは、ラズパイでよく使われるMariaDBです。MariaDBはフリーのデータベースとしてもっとも有名なMySQLの派生版で使い勝手もほぼ一緒です。(MySQLとMariaDBの比較) 使用方法の学習もMySQLの資料がそのまま使え、参考情報も広く頒布されているため採用しました。 4.I2C接続のテストとRTCの有効化 I2c接続のテストを兼ねて、DS3231によるRTCの有効化とBMP280による環境データの測定を行います。 4-1.接続方法 I2C接続では、VCC(電源)、GNDと信号用のSDC、SCLという4本の線を用いて接続します。 接続元のラズパイをマスター、接続先のセンサーをスレーブとして制御しますが4本の線を複数のスレーブ機器で共有できるため、数珠繋ぎ状の接続(デイジーチェーン)で簡単にスレーブ機器を増設できるという特徴があります。 DS3231とBMP280も上の模式図の通り、4本の配線を接続します。 ラズパイ DS3231 BMP280 3V3(Pin1) VCC VCC GND(Pin9) GND GND GPIO2(Pin3) SDA SDA GPIO3(Pin5) SCL SCL ラズパイでは使用できるI2C BUSは複数チャンネルありますが、今回はI2C1を使用しますのでSDAとSCLはそれぞれGPIO2と3(PIN3とPIN5)、VCCは3.3V(PIN1)を使用します。 4-2.DS3231の有効化 ※DS3231の有効化についてはこちらのサイトを参考にさせていただきました。 DS3231はLIR2032というボタン電池型のバッテリーを使用しますのでバッテリーを入れます。 充電機能を持ったボードですのでCR2032などの充電できないボタン電池は絶対に使用しないで下さい。 配線が接続できたら、LX terminalから以下の操作を行います。 ・I2Cの有効化 メニューから、「設定」⇒「Raspberry Piの設定」⇒「インターフェイス」タブ⇒「I2C」の「有効」をチェック ・DS3231の有効化 pi@raspberrypi:~ $ sudo apt-get purge fake-hwcloc pi@raspberrypi:~ $ sudo vi /boot/config.txt # viが立ち上がるので最後に次の行を追加して保存 dtoverlay=i2c-rtc,ds3231 pi@raspberrypi:~ $ sudo vi /etc/udev/rules.d/85-hwclock.rules # viが立ち上がり、新規ファイルを作成するので次の行を入力して保存 KERNEL=="rtc0", RUN+="/sbin/hwclock --rtc=$root/$name --hctosys" viというのはテキスト編集アプリですが、使い慣れていないと難しいかもしれません。 こちらのサイトなどで使用方法を確認してテキストを編集して保存しましょう。 ・I2C接続状況の確認 i2cdetectコマンドで、I2Cの接続状況が確認できます。 pi@raspberrypi:~ $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- 57、68が表示されている場合、配線は接続されていますがDS3231は有効化されていません。 有効化さると、68の部分がUUに変化します。 ラズパイをリブートしても有効化されない場合は次のコマンドを試してみてください。 pi@raspberrypi:~ $ sudo modprobe --first-time rtc-ds3232 4-3.BPM280による測定 BPM280による測定はpythonのプログラムで実行します。 ラズパイ標準のTohnnyもしくはvscodeなどでプログラミングしてください。 前回まではTohnnyを使用していましたが、最近vscodeを使い始めました。慣れるまでは若干の訓練が必要ですが、慣れると作業性が上がるためvscodeの使用をお勧めします。 まずは、ターミナルを開いて、次の二つのライブラリをインストールします。 pi@raspberrypi:~ $ sudo pip3 install smbus2 pi@raspberrypi:~ $ sudo pip3 install RPi.bme280 ライブラリが入ったら、サンプルコードで動作を確認します。 サンプルはこちらのコードを参考にしています。 import smbus2 import bme280 port = 1 #I2C1を使用するため1 address = 0x76 #BMP280のI2Cアドレス bus = smbus2.SMBus(port) #I2Cの設定 calibration_params = bme280.load_calibration_params(bus, address) #BMP280の設定値取得 data = bme280.sample(bus, address, calibration_params) #BMP280の測定値取得 print(data.timestamp) #測定時間表示 print("temperature : %s *C" % str(round(data.temperature,1))) #温度表示 print("pressure : %s %%" % str(round(data.pressure,1))) #気圧表示 print("humidity : %s hPa" % str(round(data.humidity,1))) #湿度表示 5.まとめ 今回は、ラズパイを使ったIoTシステム制作の前準備としてI2C接続とRTCの設定を行いました。 データ蓄積のためのデータベースの準備を行います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む