REDHATのアクティベーションメモ

 

redhatを使おうとして・・・いや、普通にインストールして使う分には使えるんですけど。

yumコマンドでupdateとかエラーになるのでなんでなんでーって調べたときのメモです。

 

周辺に聞いた所、インストールしたマシンでサブスクリプションの登録をしないと駄目って言われたんで。
そのへんのやり方を書いておきます。
昔はこんなの無かったよねー。
 今から8年前までは無かったよー。
  今はネットつないでないとなんにも出来ないんかいなー

 

■登録していない状態ではyumコマンドがこんな感じになります。

 

[xxxx@localhost ~]$ su -
Password:
[root@localhost ~]# yum update
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
There are no enabled repos.
 Run "yum repolist all" to see the repos you have.
 To enable Red Hat Subscription Management repositories:
     subscription-manager repos --enable <repo>
 To enable custom repositories:
     yum-config-manager --enable <repo>
[root@localhost ~]#

 

※エラーメッセージ翻訳
このシステムは資格サーバーに登録されていません。 サブスクリプションマネージャーを使用して登録できます。
有効なリポジトリはありません。
  「yumrepolistall」を実行して、所有しているリポジトリを確認します。
  Red Hatサブスクリプション管理リポジトリを有効にするには:
      サブスクリプションマネージャーリポジトリ--enable <repo>
  カスタムリポジトリを有効にするには:
      yum-config-manager --enable <repo>
・・・・
もうちょっと説明有ってもいいよね。

 

■redhatのページにアクセスしてユーザ登録する

 

https://access.redhat.com/

 

右上の人間マークからREGISTERとしてアカウント作成してログイン

ダウンロードはDOWNLOADSから
 古いバージョンはVersions 7 and belowから
 
ダウンロードしてインストール。
 インストールは今回はWMWare Workstation playerで実施。

インストール時に自動のままだと、GUIが起動してこないみたいなので
 途中SOFTWARE SELECTIONからGUIを選択しする。
 あとついでにキーボードをOADG109、DATE&TIMEで日本をクリック

 

以下teratermから操作

 

■現在の登録状態を表示

 

[xxxx@localhost ~]$ su -
Password:
[root@localhost ~]# subscription-manager list
+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux Server
Product ID:     69
Version:        7.6
Arch:           x86_64
Status:         Unknown
Status Details:
Starts:
Ends:

[root@localhost ~]#

 

■マシンに登録

 

[root@localhost ~]# subscription-manager register
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: xxxx.xxxx@xxx.xx.jp        ←@から後ろはいらないみたいでエラー
Password:
HTTP error (401 - Unauthorized): Invalid username or password. To create a login, please visit https://www.redhat.com/wapps/ugc/register.html
[root@localhost ~]# subscription-manager register
Registering to: subscription.rhsm.redhat.com:443/subscription
Username: xxxx.xxxx    
Password:
The system has been registered with ID: 6dd3e769-4521-4144-a028-4a138d6b58f6
The registered system name is: localhost.localdomain
[root@localhost ~]#

 

■現在の状態を表示

 

[root@localhost ~]# subscription-manager list --available
+-------------------------------------------+
    Available Subscriptions
+-------------------------------------------+
Subscription Name:   30 Day Red Hat Enterprise Linux Server Self-Supported Evaluation
Provides:            Red Hat Beta
                     Oracle Java (for RHEL Server)
                     Red Hat Enterprise Linux Server
                     Red Hat CodeReady Linux Builder for x86_64
                     Red Hat Enterprise Linux for x86_64
                     Red Hat Ansible Engine
                     Red Hat Container Images Beta
                     Red Hat Enterprise Linux Atomic Host Beta
                     Red Hat Enterprise Linux Atomic Host
                     Red Hat Container Images
SKU:                 RH00065
Contract:            12591596
Pool ID:             cmfkdm3armkrcg2s9kfk4hze8db5u7k7
Provides Management: No
Available:           2
Suggested:           1
Service Level:       Self-Support
Service Type:        L1-L3
Subscription Type:   Instance Based
Starts:              02/05/2021
Ends:                03/07/2021
System Type:         Physical

[root@localhost ~]#

 

■サブスクリプションを割り当てる

 

[root@localhost ~]# subscription-manager subscribe --pool=cmfkdm3armkrcg2s9kfk4hze8db5u7k7

  ↑さっき上で確認したPoolIDを入れる
Successfully attached a subscription for: 30 Day Red Hat Enterprise Linux Server Self-Supported Evaluation
[root@localhost ~]#

 

■サブスクリプションの状態を再度表示

 

[root@localhost ~]# subscription-manager list
+-------------------------------------------+
    Installed Product Status
+-------------------------------------------+
Product Name:   Red Hat Enterprise Linux Server
Product ID:     69
Version:        7.6
Arch:           x86_64
Status:         Subscribed ←SubscribedならOK
Status Details:
Starts:         02/05/2021
Ends:           03/07/2021

[root@localhost ~]#

 

■yumコマンドが使えるようになる

 

[root@localhost ~]# yum check-update
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
rhel-7-server-rpms                                                 | 3.5 kB  00:00:00
(1/3): rhel-7-server-rpms/7Server/x86_64/group                     | 631 kB  00:00:00
(2/3): rhel-7-server-rpms/7Server/x86_64/updateinfo                | 4.0 MB  00:00:00
(3/3): rhel-7-server-rpms/7Server/x86_64/primary_db                |  78 MB  00:00:01

centOSのOSバージョンやカーネルを上げないで
ネットワークと切り離された環境で
セキュリティーを強化したい。
と、難題を突きつけられておりまする。
 
rpmひとつひとつ持ってくるのには気が遠くなるしね。
環境の中に配布用のマシン用意できるといいみたいですが、
そんなリソース余ってないので、
最新のisoファイルを用意してそこまで上げる事でとりあえず、OKとする事にしてみます。
 
今回試したのはcentOS7.0→7.1です。
環境はいつも使っているPCにvmware workstation playerを入れて
その上でcentOSを動かしてテストしています。
 
OSバージョンとカーネルは変更しない条件です。
■母艦のLAN無しにする。これはインターネットに接続されていない条件にするため。
 
■OSインストール centOS7.0
 
■起動する
 
■VMの操作でisoを入れる。centOS7.1の媒体
 
■Teratermでログインする
 
■テラタームのログ取得設定
 
■rootに変身
 
su -
 
■CDマウント
 
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
ls -l /mnt/cdrom/
 
■リポジトリ確認と変更
 
cd /etc/yum.repos.d
ls 
 
■ファイルをテキトウに開く
 
vi CentOS-Base.repo
 
■なかみを変更
 
[base]
name=CentOS 7 x86_64 DVD
baseurl=file:///mnt/cdrom/
enabled=1
gpgcheck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
 
の感じにする
 
■リリースバージョン固定
 
echo 7.0 > /etc/yum/vars/releasever
 
■yum.confを変更してカーネルのバージョンを上げない設定をする
 
vi /etc/yum.conf
exclude=kernel* redhat-release*
    Centの場合はexclude=kernel* centos*
 
■現状の状態を記録
 
cd
cat /etc/redhat-release>oldversion.txt
yum list installed | sed -e "s/[[:space:]]¥+/¥t/g" | sed -e ':loop; N; $!b loop; ;s/¥n[[:space:]]/¥t/g' >oldlist.txt
uname -a >olduname.txt
 
■アップデートのチェック
 
yum check-update –security
 centの場合は yum check-update
 
■実際にアップデート
 
yum update –security
 centの場合は yum update
■再起動
 
reboot
 
■teratermでログイン
 
■テラタームのログ取得設定
 
■rootに変身
 
su -
 
■更新後の状態を記録
 
cat /etc/redhat-release>newversion.txt
yum list installed | sed -e "s/[[:space:]]¥+/¥t/g" | sed -e ':loop; N; $!b loop; ;s/¥n[[:space:]]/¥t/g'>newlist.txt
uname -a >newuname.txt
 
■新旧で比較
 
diff -BbwE oldlist.txt newlist.txt >diff.txt
 
 

 

ESP32CAMを使ってみた感想。
 
これは、ESP32の性能なら行けるのか?
1000円でこの性能とは?
 

 
と言いたいので、amazonでポチっておいたESP32CAM
放置しておいたのを発掘したので本日試してみることが出来ました。
 
ビデオ

 
 
 
結構遅延します。
でも、遠隔地から様子を見たい場合は使えると思います。
安定して動くようであればOKですね。
遅延自体は問題ではなくて問題は途中のコマをだいぶ飛ばすところでして。
とつぜん、違う場面になってしまいそうですね。
 
構築はこちら
ESP32CAMとArduinoでWiFi経由のWebカメラを作る 設定方法から撮影まで
https://enjoy-life-fullest.com/2020/08/16/post-467/
を完全になぞっている内容なので、新しい要素はありません。
ちなみに、上記の人はラジコンに載せたりして楽しんでおりますので
ぜひご参照下さい。
 
以下は自分用構築メモです。ArduinoIDEの操作から始めます。
 
1 ボードにESP32 Wrover moduleを選択
 

2 スケッチ例からCameraWebServerを選択
 スケッチ例→ESP32→Camera→CameraWebServer
 

3 ソースを修正
 
以下のようにSelect camera modelの所を修正
 #define CAMERA_MODEL_WROVER_KITをコメントにして
 //#define CAMERA_MODEL_AI_THINKERのコメントを外す
 
 
 // Select camera model
 //#define CAMERA_MODEL_WROVER_KIT
 //#define CAMERA_MODEL_ESP_EYE
 //#define CAMERA_MODEL_M5STACK_PSRAM
 //#define CAMERA_MODEL_M5STACK_WIDE
 #define CAMERA_MODEL_AI_THINKER
 
4 WIFIのSSIDとパスワード設定
 
 *のところを自分のWIFIに合わせて変更
 
 const char* ssid = "********";
 const char* password = "********";
 
5 ハードウェア側の準備
 
 接続
  ESP32CAM ---- UART
  TXD       UOR
  RXD       UOT
  5V        5V
  GND       GND
  IO0       GND
 
 電源OFF-ONまたはESP32CAMのリセットボタンを押す
  (電源OFF-ONは一旦5V電源を抜いて再接続)
 
6 プログラム書き込み
 
 arduinoIDEでいつものようにコンパイルしてボードに書き込む
 つまりプログラム書き込み時はIO0をGNDにしておく必要があります。
 
7 上の5に書いたIO0の線を外してから、
  リセットするか、一旦電源を抜いて再接続
  (これでプログラムが実行されます。)
 
8 arduinoIDEのシリアルモニタにIPアドレスが表示されるので
  ブラウザーでそのIPアドレスを表示する。
  http://192.x.x.x:80/
  ポートは80なので省略可能だけど、
  自分の場合はシリアルモニターに謎の81って表示されていて
  ポート81と勘違いしてここでツマヅイたのでみなさんは注意されたし。
 
9 そうすると、しばらく待つかもしれませんけど
  なんかメニュー的画面が表示される。
  下の方に静止画と動画とボタンが有るのでそれを押すと画面取れます。
  
感想。
 安価だし、良いもの作っている。
 ネットワーク負荷を見ていたけど、多くても500Kbps程度なので
 全然問題ないレベルなので、
 ライブラリーの中身をイロイロいじれば安定して転送手出来るに違いない。
 妄想発動中。
 

 

GPS受信機キット 1PPS出力付き 「みちびき」3機受信対応(K-09991)[AE-GYSFDMAXB]
 
GPS装置。20年ぐらい前にいろいろ触ったとき有ったけど、
どこか変わっているのかなと思い秋月でポチっておいたやつ。
 
昨日を休んで連休にしたけど、どこにも遊びに行けないので
家の中で発散中。
 
簡単にできそうなものがだんだん少なくなる中で、超簡単にできちゃったので
念の為記事にしておくきます。
GPSの実態はNMEAなので、そこに進歩はなくて、
センチメートル級にするには地上局との通信が必要で、みたいな感じでしょうかね。
 

 
実際の画面は上の感じでTeraTermにて受信可能です。9600bps、8bit、N、1
それで、注意するところは、この機種の場合、電源電圧は5Vだけど、
UARTのデータ通信のほうが3.3V系ってことなので、
注意が必要です。データ線に5V入れても壊れるかは試してないのですが、
多分大丈夫な気がします。
念の為に、5V側から出すTXの信号にはダイオード仕込んでくと少し安心です。
 
■NMEAについて。
 
NMEAという規格にそってGPSちゃんは情報は現在位置情報とか認識できている衛星とか、
衛星の場所とかいろいろ教えてくれるってわけですが、
中身の詳しい解説はNMEAで検索すれば沢山出てきますのでそっちを見てくださいね。
 
だいたいの人は現在位置さえわかれば良いはずなので
GPGGAだけここに乗せておきます。
 
■実際の受信イメージ
$GPGGA,062212.000,3540.5613,N,13939.9524,E,1,3,3.80,109.2,M,39.3,M,,*5A
 
意味、
$GPGGA:現在位置の情報送るからねー
062212.000:今の時刻は世界標準時で6時22分12秒だぜー。日本の時刻にするには9時間足してね
 ・・・って感じでテキストで送ってくるよ。csv形式ですね。
3540.5613:下の1行と合わせて北緯35度40分5613
N:N=北緯、South=南緯
13939.9524:下の1行と合わせて東経139度39分9524
E:E=東経、W=西経
1:SPS標準測位、他には0=位置特定できない、2=DGPS干渉測位方式
3:使用している衛生数3
3.80:水平精度低下率 よくわからん
109.2:アンテナの高さ(海抜)。下の1行と合わせて109.2メートル
M:
39.3:アンテナの高さ(ジオノイド)。下の1行と合わせて39.3メートル
M:
:DGPS不使用、他にはDGPSと最後にRTCM通信からの経過時刻。この機種は対応していないと思われ。
*5A:チェックサム
※DGPS:ディファレンシャルGPS。固定の基地局で受信した誤差を通信を使用して
    取得することで補正する方式。誤差を1メートル前後にすることが出来る
 

 

圧電振動ジャイロモジュール(K-04912)+16ビットADコンバーターMCP3425(K-08018)
 
圧電振動ジャイロモジュール(K-04912)とarduinoの組み合わせでは細かい電圧の変化が
測定できなかったために、駄目だねってなっておりました角度のやつですが、
16BITのADCなら大丈夫だろうと思いまして。結構ゆっくり動かせばOKなのでその報告です。
 
先日の記事
https://ameblo.jp/fc2miha/entry-12833772982.html

 
先日の記事ではarduino内蔵のadcでは測定の分解能が4.89mVですので、
圧電振動ジャイロモジュール(K-04912)の角度あたりの電圧の変化
1度あたり、0.67mVの測定ができないため、角度の再出が出来なかった。
残念な記事が上のやつですけど
16bitのADCならどうかな?って事でやってみました。
で、これのADC前の記事でも書きましたけど


分解能が63μボルトですから、余裕で測れますよね。
みたいな感じでやっております。
 
■ビデオ

 
 
 
(見て下さい。結構いい感じじゃないでしょうか?)
 
■回路図
 
 圧電振動ジャイロモジュール(K-04912)----16ビットADコンバーターMCP3425(K-08018)----arduino
 
 K-04912からK-08018はアナログ接続します。
 ADCからarduinoはI2Cで通信します。
 
■プログラム解説
 
 getADCはI2C通信でADCからの値を読み取ります。
 loopの中身先日の記事とほぼ、同じです。
 違うのはADCの電圧測定周期が1秒間に15回なので
 delayの数字とループ回数等変わっております。
 それと、角度に置き換えるために、基準電圧との差分を
 (0.67/1000)で除算する事で角度に置き換えています。
 そして最後に15で割ります。
 
■プログラム

#include <Wire.h>
#define MCP3425_address 0x68
 
void setup()
{
    pinMode(13, OUTPUT);
    
    Wire.begin();
    
    Serial.begin(9600);
    Serial.println("jairo enc-03R to MCP3425 ver1.0");
    Serial.println("start:");

    //モード設定 16ビット 15回/秒 PGA=1 連続変換モード
    Wire.beginTransmission(MCP3425_address);
    Wire.write(0b10011000);
      // bit7 :レディービット
      //        読み込み時
      //         0=レジスタ更新あり、1=レジスタ更新なし
      //        書き込みで連続変換モード時
      //         影響なし
      //        書き込みでワンショット時
      //          0=影響なし
      //          1=新しい変換を開始
      // bit6  :使用しない
      // bit5  :使用しない
      // bit4  :変換モード
      //         1=連続
      //         0=ワンショット(ワンショット後低電力モードへ)
      // bit3-2:サンプルレート
      //         00=240回/秒(12ビット)
      //         01= 60回/秒(14ビット)
      //         10= 15回/秒(16ビット)
      // bit1-0:PGAゲイン(前段のアンプみたいなやつ)
      //         00=1倍
      //         01=2倍
      //         02=4倍
      //         03=8倍
    Wire.endTransmission();
}
 
void loop()
{
//    int adcValue = getADC();
//    float Volts = (int)adcValue * 2.048 / 32767.0 ;
//    Serial.println(String(Volts,5));

  Serial.println("loop:");

  digitalWrite(13, LOW);

  float kakudo = 0;
  //base_voltageを15回の平均で求める
  float base_voltage = 0;
  for(int i=0;i<15;i++){
    base_voltage = base_voltage + (getADC() * 2.048 / 32767.0);
    delay(67);
  }
  base_voltage = base_voltage / 15;
  //base_voltage = 1.35;

  Serial.print("base_voltage = ");
  Serial.println(base_voltage);

  Serial.print("stand by ");
  delay(1000);
  Serial.print("2");
  delay(1000);
  Serial.print("1");
  delay(1000);
  Serial.println("go");
  digitalWrite(13, HIGH);

  for(int i=0;i<17;i++){
    float voltage = ( getADC() * 2.048 / 32767.0);
    kakudo = kakudo + ((voltage - base_voltage)/(0.67/1000));
    //if(voltage==2.048){
    //  Serial.println("overflow");
    //}
    //Serial.print("volt=");
    //Serial.println(voltage);
    delay(67);
  }
  digitalWrite(13, LOW);
  
  Serial.print("kakudo = ");
  Serial.println(kakudo/17);

  delay(2000);

    
}
 
int getADC()
{
    Wire.requestFrom(MCP3425_address, 2);
    int nfRtn = (Wire.read() << 8 ) + Wire.read();
    return ( nfRtn );
}

人感センサーAKE-1(RE-210)をarduinoに直結して人感してみた
 
AKE-1(RE-210)から直結でarduinoにて人感センサーしてみます。
このぐらいのならArduinoの10bitのADコンバーターでも動きますね。
 
■こんな感じで動きます。
前の記事と見た目変わらないので同じの入れました。(手抜き君)
https://youtu.be/fyyQKBOMuXg
 

 
■回路
 

 
■プログラム解説
arduino内蔵のADCコンバーターから受け取った電圧10回分の平均と直近の1回分を比較して
5mV違った場合に変化があった(人を検出)と判断してLEDを10秒間点灯します。
 

■プログラム


#define TABLE_MAX 10
float table[TABLE_MAX];
int table_idx=0;

void setup()
{
    //
    pinMode(13, OUTPUT);
    //
    Serial.begin(9600);
    Serial.println("AKE-1(RE210)直結");

    //table初期化
    for(int i=0;i<TABLE_MAX;i++){
      table[i]=0.0;
    }
}

int led_count=0;
void loop()
{
    //
    float Volts = (int)analogRead(A0) * 3.3 / 1023.0 ;
    Serial.println(String(Volts,5));
    //Serial.print(" ,");
    //Serial.println(adcValue);

    //tableの平均を求める
    float total = 0;
    for(int i=0;i<TABLE_MAX;i++){
      total = total + table[i];
    }
    float ave = total / TABLE_MAX;

    //比較
    if(Volts < (ave - 0.005)){
      digitalWrite(13, HIGH);
      led_count=0;
      Serial.print("volt = ");
      Serial.print(String(Volts, 5));
      Serial.print(" ave = ");
      Serial.println(String(ave, 5));
    }
    
    //tableに格納
    table[table_idx]=Volts;
    table_idx++;
    if(table_idx>=TABLE_MAX){
      table_idx = 0;
    }

    if(led_count>100){
      digitalWrite(13, LOW);
    }
    led_count++;
    delay(100);
}

 
 
 

人感センサーAKE-1(RE-210)と16ビットADコンバーターMCP3425(K-08018)で人感してみた
 
AKE-1(RE-210)このセンサー結構扱い難しいですよね。
今回は今週れに入れたADC(MCP3425(K-08018))を使ってarduinoにて人感センサーしてみます。
 
■こんな感じで動きます。
https://youtu.be/159qh-mHIHg

 
■回路
 

 
■プログラム解説
ADCコンバーターから受け取った電圧100回分の平均と直近の1回分を比較して
5mV違った場合に変化があった(人を検出)と判断してLEDを10秒間点灯します。
■プログラム
 

#include <Wire.h>
#define MCP3425_address 0x68

#define TABLE_MAX 100
float table[TABLE_MAX];
int table_idx=0;

void setup()
{
    //
    pinMode(13, OUTPUT);
    //
    Wire.begin();
    Serial.begin(9600);
    Serial.println("AKE-1(RE210)---adc mcp3425");

    //モード設定 16ビット 15回/秒 PGA=1 連続変換モード
    Wire.beginTransmission(MCP3425_address);
    Wire.write(0b10011000);
      // bit7 :レディービット
      //        読み込み時
      //         0=レジスタ更新あり、1=レジスタ更新なし
      //        書き込みで連続変換モード時
      //         影響なし
      //        書き込みでワンショット時
      //          0=影響なし
      //          1=新しい変換を開始
      // bit6  :使用しない
      // bit5  :使用しない
      // bit4  :変換モード
      //         1=連続
      //         0=ワンショット(ワンショット後低電力モードへ)
      // bit3-2:サンプルレート
      //         00=240回/秒(12ビット)
      //         01= 60回/秒(14ビット)
      //         10= 15回/秒(16ビット)
      // bit1-0:PGAゲイン(前段のアンプみたいなやつ)
      //         00=1倍
      //         01=2倍
      //         02=4倍
      //         03=8倍
    Wire.endTransmission();
    
    //table初期化
    for(int i=0;i<TABLE_MAX;i++){
      table[i]=0.0;
    }
}

int led_count=0;
void loop()
{
    //
    int adcValue = getADC();
    float Volts = (int)adcValue * 2.048 / 32767.0 ;
    //Serial.println(String(Volts,5));
    //Serial.print(" ,");
    //Serial.println(adcValue);

    //tableの平均を求める
    float total = 0;
    for(int i=0;i<TABLE_MAX;i++){
      total = total + table[i];
    }
    float ave = total / TABLE_MAX;

    //比較
    if(Volts < (ave - 0.005)){
      digitalWrite(13, HIGH);
      led_count=0;
      Serial.print("volt = ");
      Serial.print(String(Volts, 5));
      Serial.print(" ave = ");
      Serial.println(String(ave, 5));
    }
    
    //tableに格納
    table[table_idx]=Volts;
    table_idx++;
    if(table_idx>=TABLE_MAX){
      table_idx = 0;
    }

    if(led_count>1000){
      digitalWrite(13, LOW);
    }
    led_count++;
    delay(10);
}
 
int getADC()
{
    Wire.requestFrom(MCP3425_address, 2);
    int nfRtn = (Wire.read() << 8 ) + Wire.read();
    return ( nfRtn );
}

 

16ビットADコンバーターMCP3425(K-08018)
 
なんかね、細かく電圧を測りたくて、
マイクロアンペアを正確に測れる測定器を作りたくて
あれからイロイロ悩んでいるんですけど、
とりあえず、arduino付属のadcでは前に記事でも書いたけど、
https://ameblo.jp/fc2miha/entry-12833772982.html
5Vの場合分解の10bitでは最小単位が4.8mVになってしまいまして
つまり、問題外なぐらいに分解能が低いので
16ビットのを試してみることにした。
16ビットなら5V/65536=0.000076V=76μボルトになるので、
それなりに直流回路に10Ωぐらい挟んであげてその抵抗に掛かる電圧を測定すれば
小さな電圧が出てくるはずなのでそれを測ってあげればいいかなーとか思いましたので、
そんで実験です。
 
使用したのはみんな大好き秋月電子のMCP3425(16Bit ADC I2C 基準電圧内蔵)搭載モジュール
 

 
これ、なかなか期待大です。
 
回路図
 

(真ん中ヘンに有る可変抵抗を回して電圧を変更して様子を見ます。)
 
実験結果
 
https://youtu.be/y5Y5Wj3_-YA

 
これって、
基準電圧2.048Vって書いてあるけど、2.048V以上は測定できないみたいですね。
逆にマイナスが測定できるっぽくて-2.048~+2.048の範囲のようです。
 
あと、上の実験では電圧値で表示しているけど、adcから取得した値をそのまま表示すると、
最大が32767になりました。
 
なので、上記の目論見ハズレましたが、基準電圧が下がったので
2.048/32767=63μボルトなので、ま、だいたいそんな感じですね。
 
■プログラム解説
 
大事な変換モードの設定。
 bit7 :レディービット
    読み込み時
     0=レジスタ更新あり、1=レジスタ更新なし
    書き込みで連続変換モード時
     影響なし
    書き込みでワンショット時
     0=影響なし
     1=新しい変換を開始
 bit6 :使用しない
 bit5 :使用しない
 bit4 :変換モード
     1=連続
     0=ワンショット(ワンショット後低電力モードへ)
 bit3-2:サンプルレート
     00=240回/秒(12ビット)
     01= 60回/秒(14ビット)
     10= 15回/秒(16ビット)
 bit1-0:PGAゲイン(前段のアンプみたいなやつ)
     00=1倍
     01=2倍
     02=4倍
     03=8倍
今回は
 0b10011000
  なので、16ビット 15回/秒 PGA=1 連続変換モード
 
getADCは16ビットのデータを1バイトづつ読み出して
最初に来たほうを8ビットシフトして16ビットに合体して返します。
 
■プログラム

#include <Wire.h>
#define MCP3425_address 0x68
 
void setup()
{
    Wire.begin();
    Serial.begin(9600);
    Serial.println("adc mcp3425");

    //モード設定 16ビット 15回/秒 PGA=1 連続変換モード
    Wire.beginTransmission(MCP3425_address);
    Wire.write(0b10011000);
      // bit7 :レディービット
      //        読み込み時
      //         0=レジスタ更新あり、1=レジスタ更新なし
      //        書き込みで連続変換モード時
      //         影響なし
      //        書き込みでワンショット時
      //          0=影響なし
      //          1=新しい変換を開始
      // bit6  :使用しない
      // bit5  :使用しない
      // bit4  :変換モード
      //         1=連続
      //         0=ワンショット(ワンショット後低電力モードへ)
      // bit3-2:サンプルレート
      //         00=240回/秒(12ビット)
      //         01= 60回/秒(14ビット)
      //         10= 15回/秒(16ビット)
      // bit1-0:PGAゲイン(前段のアンプみたいなやつ)
      //         00=1倍
      //         01=2倍
      //         02=4倍
      //         03=8倍
    Wire.endTransmission();
}
 
void loop()
{
    int adcValue = getADC();
    float Volts = (int)adcValue * 2.048 / 32767.0 ;
    Serial.println(String(Volts,5));
    //Serial.print(" ,");
    //Serial.println(adcValue);
    
    delay(100);
}
 
int getADC()
{
    Wire.requestFrom(MCP3425_address, 2);
    int nfRtn = (Wire.read() << 8 ) + Wire.read();
    return ( nfRtn );
}

3軸加速度センサー-ADXL-335モジュール(K-07234)
 
前回の記事に引き続き、今度は3軸加速度センサーのお試しです。
プログラム的には単純にADコンバーターの端子から値を読み取って、
しきい値を超えた場合に数値を表示するだけのプログラムにしています。
X軸だけ読み取っているので横方向の場合は数字がどんどんスクロールしますが、
縦方向(前後?)はほとんどスクロールしません。
 
■実験動画
 

■プログラム

 

void setup()
{
  Serial.begin(9600);
}

int count=0;
void loop() {
  
  float voltage = (analogRead(A0) / 1024.0) * 3.3;

  if( voltage < 1.5 || 1.7 < voltage){
    Serial.print(count);
    Serial.print(", ");
    Serial.print(voltage);
    Serial.println("");
    count++;
  }
  
  delay(1);
}


 

圧電振動ジャイロモジュール
物体が動くのを知りたい場合、ジャイロとか、加速度センサーとかイロイロ有るみたいですが、
その分野はやってみた事がなかったのでやってみた。の記事です。
使ったセンサーは秋月で手に入る。圧電振動ジャイロモジュールです。K-04912
2軸分の回転が検出できるので前後への回転と横方向の回転が同時に検出可能です。
回転がわかるば角度がわかると思ってイロイロやってみたのですが、
結局、角度までは持っていけなかったんですけど、
どちらの方向にどのぐらい回転したかの目安程度には検出できましたので
ここまでの成果という事で記録しておきます。
 
■モジュールについて。
 
これなんか変なんです。
説明書によれば、静止時に1.35Vを検出するはずなんですけど
 1.45Vですし。実際にテスターを当てて測定したので正確と思います。
 このせいで、静止時の電圧を毎回測定するプログラムにしています。
 
■arduinoとの組み合わせ
 arduinoを使用してadcの端子で電圧を測定した場合に
 5Vの場合5Vを与えると1023って出力されるので
 分解能で言えばarduinoの1は0.00489V=4.89mVなんです。
 このモジュール散々やった後で気づいたんですが、
 角度が1度変わった場合に0.67mV電圧が変化するって事なので、
 (最初見た時は67mVと読み違えておりました。)
 arduinoのanalogreadの1の変化が4.89/0.67=7.2度なんでした。
 なので、測定の誤差とかも考慮すると、たいたいの目安が測定できれば
 arduino的には合格なのかなと思います。
 自分に甘い?
 
■プログラム解説
 
起動後3秒間カウントダウンして、LEDを点灯。
その後の1秒間の回転動作を検出するプログラムです。
プログラムの動作としてはloopの中で以下を行います。
 LEDを消灯
 電圧をを100回測定して平均値を基準電圧とする。
 3秒カウントダウンをシリアルに出力。
 LEDを点灯。
 実際の測定。20㍉秒delayしながら50回差分を測定し、合計を求める
 ループ脱出後係数20を掛け算してシリアルに出力
 LEDをを消灯
モジュールの説明に50Hzとありましたので、
1秒間に50回測定しすれば良いのかなと思いまして。
20㍉秒delayしながら50回分の電圧を測定することにしています。
 
■プログラム(3.3Vのarduinoを使用しています)
 

void setup() {
  pinMode(13, OUTPUT);

  Serial.begin(9600);
  Serial.println("jairo enc-03R ver1.0");
  Serial.println("start:");
}

int flag = LOW;


void loop() {
  Serial.println("loop:");

  digitalWrite(13, LOW);

  float meyasu = 0;
  //base_voltageを100回の平均で求める
  float base_voltage = 0;
  for(int i=0;i<100;i++){
    base_voltage = base_voltage + (analogRead(A0) * 3.3 / 1023.0);
  }
  base_voltage = base_voltage / 100;
  //base_voltage = 1.35;

  Serial.print("base_voltage = ");
  Serial.println(base_voltage);

  Serial.print("stand by ");
  delay(1000);
  Serial.print("2");
  delay(1000);
  Serial.print("1");
  delay(1000);
  Serial.println("go");
  digitalWrite(13, HIGH);

  for(int i=0;i<50;i++){
    float voltage = ( analogRead(A0) * 3.3 / 1023.0);
    meyasu = meyasu + (voltage - base_voltage);
    delay(20);
  }
  digitalWrite(13, LOW);
  
  Serial.print("meyasu = ");
  Serial.println(meyasu*20);

  delay(2000);
 
}