工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

GPSでDS3231を設定

コンポーネントと消耗品

>
Arduino Nano R3
× 1
DS3231クロックモジュール
× 1
NEO 6MGPSモジュール
× 1
BI DIRECTIONAL LEVEL SHIFTER
× 1
LCD 16 * 2ディスプレイ
× 1
I2CLCDバックパック
× 1
15ウェイ0.1インチソケット
× 2
6ウェイ0.1インチソケット
× 2
4ウェイ0.1インチソケット
× 1
5ウェイ0.1インチソケット
× 1
4ウェイ0.1インチピンストリップ
× 1
ストリップボード24ストリップ* 37列
× 1
4K7抵抗器
× 2
押しボタン(単極瞬間6m四方)
× 1

このプロジェクトについて

DS3231がドリフトし、システム時間を使用してコードをコンパイルすることで通常の更新を行っていましたが、コンピューターで発生している他のプロセスによってコンパイルとアップロードが中断され続けるため、これは少し不正確であることがわかりました。

GPSが正確な時刻(UTC)と日付を提供していることを確認した後、それを使用してDS3231を設定することにしました。

回路:

ArduinoへのLCDバックパック:

GND-GND

VCC-5V

SDA-SDA(A4)

SCL-SCL(A5)

ArduinoへのDS3231クロックモジュール:

GND-GND

VCC-5V

SDA-SDA(A4)

SCL-SCL(A5)

Arduinoのレベルシフター:

5V-5V

GND-GND

D3-バス

D4-バス

レベルシフターからのNEO6M GPS:

3V-VCC

GND-GND

バス-TXD(最終的にD3になります)

バス-RXD(最終的にD4になります)

連絡先の切り替え:

スイッチ-D9

スイッチ-GND

パワー:

USBケーブルを介して回路に電力を供給しています。

ソフトウェア:

ソフトウェアの99%は、AdafruitGPSライブラリのparseing.inoの例です。抽出したGPS日時をDS3231に渡すための少量のコードと、DS3231からの時刻をLCDディスプレイに表示するための追加のコードを追加しました。

使用されているライブラリ:

Adafruitバージョン1.0.3によるAdafruitGPSLibrary

RTCLib byAdafruitバージョン1.2.0

I2Cディスプレイバックパック用のNewLiquidCrystal。

操作:

ユニットの電源を入れます。

LCDには、現在DS3231レジスタにある日付と時刻の値が表示されます。

GPSがロックされるまでしばらく待ちます。

ボタンを押して、GPS信号で時刻を設定します。

LCDに新しい時刻が表示されます。

操作の制限:

GPSユニットはロックに時間がかかり、ロックが達成されたことを示すインジケーターはありません。ロックなしで設定ボタンを押すと、DS3231の日付が2000:0:0に設定され、時刻が0:0:0に設定されました。

>

GPSユニットの赤いLEDが点滅し始めたら、設定ボタンを押すのに最適な時間のようです。これは数十分(屋内)になる場合があります。

当初、私が使用したDS3231ユニットはフラットバッテリーでしたが、セットを押すと、日付は2000:0:0に設定され、時刻は0:164:164に設定されました。バッテリーがGPSデータを受け入れ、それ自体で正しく作動し続けるのに十分な充電が行われるまでには、かなりの時間がかかりました。

GPSの癖:

私が購入したボードは、単にNEO 6M GPSと言っており、接続ピンにはその機能が記されています。デバイスのデータシート[1]を調べたところ、デバイスは約3Vで機能していると記載されていたため、レベルシフターを使用しました。しかし、詳しく調べてみると、4A2Dチップがボードにはんだ付けされていることがわかりました。インターネット検索では、4A2Dチップが電圧レギュレータであることが示されていますが、これは通信回線のレベルシフトを保証するものではありません(私のユニットには回路図がありません)。

また、GPSモジュールによって、屋内で良好な信号を受信する能力が異なることをオンラインで読んだので、LCDディスプレイを追加して、屋外に持ち出すことができました。

LCDの癖:

私は0x3FのI2Cアドレスを持つ奇妙なものの1つを使用していますが、ほとんどはアドレス0x27を使用しているので、何も表示されない場合は、最初にそれを変更してみてください。

ライブラリの癖:

libraryRTCLib(Adafruitバージョン1.2.0)は、DS3231の時刻と日付のレジスタを設定しますが、日付のレジスタは設定しません。ライブラリには、日付レジスタの値を使用してオンザフライで計算された曜日を返す機能があります。

これは奇妙だと思いましたが、最終的には理にかなっていることに気付きました。日レジスタを設定するには、うるう年に変更するようにコードを設定する必要がありますが、数式で日を生成することでこれを回避できます。

UTCと現地時間:

UTCで検索したところ、現地時間に変更は必要ないことがわかりました。そのため、必要に応じて、そのコードを自分で追加する必要があります。

参照:

[1]https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf(2018年12月に取得)

コード

  • DS3231コードファイルを設定する
DS3231コードファイルを設定する Arduino
 // I2CとWireを介して接続されたDS3231RTCを使用した日付と時刻の機能lib#include  #include "RTClib.h" //マシン上のAadafruitバージョン1.2.0RTC_DS3231RTC; char daysOfTheWeek [7] [12] ={"Sunday"、 "Monday"、 "Tuesday"、 "Wednesday"、 "Thursday"、 "Friday"、 "Saturday"}; const int days_string_length =12; //時計の終わり//液晶用display //#include  //すでに含まれています(上記)//ここでLCD I2Cライブラリを取得します:// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads#include // 0x3Fの異常なアドレスに注意してください。ほとんどのlcdは0x27のアドレスを使用しているため、何も表示されない場合は、firstLiquidCrystal_I2C lcd(0x3F、2、1、0、4、5、6、7、3、POSITIVE);を変更してみてください。 // LCDI2Cアドレスを設定します//液晶ディスプレイの終わり//ボタン#defineボタン9 // MTK3329 / MTK3339ドライバーを使用したAdafruitGPSモジュールのテストコード////このコードは、GPSモジュールを聞く方法を示していますプログラムがより多くの「自由」を持つことを可能にする割り込み//-新しいNMEAセンテンスが利用可能になったときに//解析するだけです!次に、必要に応じてデータにアクセスします。////テスト済みでAdafruit UltimateGPSモジュールで正常に動作します// MTK33x9チップセットを使用します// ------> http://www.adafruit.com/products/746/ /今日Adafruitの電器店で1つ受け取り、//オープンソースのハードウェアとソフトウェアのサポートを手伝ってください! -ada#include  #include  // GPSモジュールを使用している場合:// GPS電源ピンを5Vに接続します// GPSアースピンをアースに接続します//ソフトウェアを使用している場合シリアル(デフォルトのスケッチ例):// GPSTX(送信)ピンをデジタル3に接続します// GPS RX(受信)ピンをデジタル2に接続します//ハードウェアシリアル(ArduinoMegaなど)を使用している場合:// GPSを接続しますTX(送信)ピンをArduino RX1、RX2、またはRX3 // GPS RX(受信)ピンを対応するTX1、TX2、またはTX3 //に接続します。AdafruitGPSシールドを使用している場合は、// SoftwareSerial mySerial(3、2 ); -> SoftwareSerial mySerial(8、7); //スイッチがSoftSerialに設定されていることを確認してください//ソフトウェアシリアルを使用している場合は、この回線を有効にしてください//(ピン番号は配線に合わせて変更できます):SoftwareSerialmySerial( 3、2); //ハードウェアシリアル(Arduino Megaなど)を使用している場合は、//上記のSoftwareSerial行をコメントアウトし、代わりにこの行を有効にします//(シリアル番号は配線に合わせて変更できます):// HardwareSerial mySerial =Serial1; Adafruit_GPS GPS(&mySerial); // GPSECHOを「false」に設定してGPSデータのシリアルコンソールへのエコーをオフにします//生のGPSセンテンスをデバッグして聞く場合は、「true」に設定します。 #define GPSECHO false // --------->オフ//これは割り込みを使用しているかどうかを追跡します//デフォルトでオフです!booleanusingInterrupt =false; void useInterrupt(boolean); // FuncプロトタイプはArduino0023を維持しますhappyvoidsetup(){// 115200で接続するので、GPSを十分に速く読み取り、文字を落とさずにエコーできます//また、Serial.begin(115200);を吐き出します。 Serial.println( "Adafruit GPSライブラリの基本テスト!"); // 9600 NMEAは、Adafruit MTKGPSのデフォルトのボーレートです。4800GPS.begin(9600);を使用するものもあります。 //この行のコメントを解除して、高度GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);を含むRMC(推奨最小値)およびGGA(修正データ)をオンにします。 //この行のコメントを解除して、「最小推奨」データのみをオンにします//GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); //データの解析には、RMCのみまたはRMC + GGA以外のものを使用することはお勧めしません。//パーサーは現時点では他の文を気にしないため、//更新レートを設定しますGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hzの更新レート//解析コードが適切に機能し、データを並べ替える時間があり、// 1 Hzを超えるものを使用することはお勧めしません//アンテナステータスの更新をリクエストし、コメントします静かにするために外に出るGPS.sendCommand(PGCMD_ANTENNA); //このコードの良いところは、timer0割り込みを// 1ミリ秒ごとにオフにして、GPSからデータを読み取ることができることです。これにより、//ループコードが非常に簡単になります。 useInterrupt(true); delay(1000); //ファームウェアバージョンを要求しますmySerial.println(PMTK_Q_RELEASE); // lcdを開始lcd.begin(16,2); lcd.backlight(); lcd.clear(); //セットアップボタンpinMode(button、INPUT_PULLUP); } //割り込みはミリ秒に1回呼び出され、新しいGPSデータを探して、それを保存しますSIGNAL(TIMER0_COMPA_vect){char c =GPS.read(); //デバッグする場合は、デバッグするのに適したタイミングです!#ifdef UDR0 if(GPSECHO)if(c)UDR0 =c; // UDR0への直接書き込みは、Serial.printよりもはるかに高速です//ただし、一度に書き込むことができるのは1文字のみです。 #endif} void useInterrupt(boolean v){if(v){// Timer0はすでにmillis()に使用されています-途中で//割り込み、OCR0A =0xAFの上の「CompareA」関数を呼び出します。 TIMSK0 | =_BV(OCIE0A); usingInterrupt =true; } else {//割り込み関数COMPAをもう呼び出さないTIMSK0&=〜_BV(OCIE0A); usingInterrupt =false; }} uint32_t timer =millis(); void loop()//何度も実行する{//上記の割り込みを使用していない場合は、// GPSを「手動で照会」する必要があります(推奨されていません)。 (if(!usingInterrupt){// 'メインループ'でGPSからデータを読み取るcharc =GPS.read(); //デバッグする場合は、これを実行するのに適したタイミングです!if(GPSECHO) if(c)Serial.print(c);} //センテンスを受信した場合、チェックサムをチェックして解析できます... if(GPS.newNMEAreceived()){//ここで注意が必要なのは印刷する場合ですNMEAセンテンス、またはデータ//他のセンテンスをリッスンしてキャッチしないことになります!// OUTPUT_ALLDATAを使用してデータを出力しようとする場合は、非常に注意してください//Serial.println(GPS.lastNMEA());//これもnewNMEAreceived()フラグをfalseに設定if(!GPS.parse(GPS.lastNMEA()))//これもnewNMEAreceived()フラグをfalseに設定return; //文の解析に失敗する可能性がある場合、その場合は別の} // mの場合illis()またはタイマーがラップアラウンドします。(timer> millis())timer =millis(); static bool second_time_round =false;の場合、リセットします。 //約2秒ごとに、現在の統計を出力します// if(millis()-timer> 2000){// timer =millis(); //タイマーをリセットします//ボタンが押された場合にデータをクロックに書き込みます-ボタンは通常内部プルアップによってハイに保持されますif(!digitalRead(button)){//注:RTClibはDS3231の曜日レジスタを明示的に設定しません。//代わりに、dayOfTheWeek()を使用すると、日付に基づく数式によって日が計算されます。 //日曜日はゼロと見なされます。//(ライブラリヘッダーとccpファイルの読み取りに基づく)// set rtc RTC.adjust(DateTime(GPS.year、GPS.month、GPS.day、GPS.hour、 GPS.minute、GPS.seconds)); // lcd lcd.clear(); lcd.setCursor(2,0); lcd.print( "プレスセット"); delay(5000); lcd.clear(); } DateTime now =RTC.now(); lcd.setCursor(4,0); lcd.print(now.year()、DEC); lcd.print( '/'); lcd.print(now.month()、DEC); lcd.print( '/'); lcd.print(now.day()、DEC); lcd.print( ''); lcd.setCursor(4,1); lcd.print(now.hour()、DEC); lcd.print( ':'); lcd.print(now.minute()、DEC); lcd.print( ':'); lcd.print(now.second()、DEC); lcd.print( "");} 

回路図


製造プロセス

  1. 止めねじとは?
  2. ベン図とセット
  3. 永続的な遺産を残す
  4. SMRPは、一連のM&Rメトリック定義を公開します
  5. Java 10 - 環境設定
  6. セット スクエアとは?
  7. 昔ながらの方法による表面研磨
  8. 最良の選択:ボックスウェイ CNC 旋盤
  9. パンチセットとは?
  10. リニアウェイCNC旋盤とは?
  11. メカニック ツールセットについて