メモリを備えた非常に軽量な低電力マイクロコントローラ?


9

Arduinoを使用していくつかのプロジェクトを構築しています。新しいプロジェクトでは、皮膚表面の温度と時間(おそらく1日に数回)のほか、電圧など他の簡単に取得できる情報をログに記録します。

私はすべてをできるだけ小さく、軽量にする必要があります(小さい哺乳類の皮膚温度を測定するため)。つまり、5g未満、できれば軽量、理想的にはバッテリーを含めて3gで、50-動物100gすぎます。

私は、電圧レギュレータを取り除くことによって、より少ない電流を使用するようにarduino pro miniを変更することが可能かもしれないと読んだことがありますか?しかし、おそらく完全に変更して、誰かが推奨できる別のタイプのマイクロコントローラーをプログラムすることを学ぶ方が賢明でしょうか?軽量のコイン電池または同様の軽量のバッテリーから直接操作できるようにする必要があります。(私はarduinoプロミニ用の軽量の3.3Vバッテリーを見つける方法もわかりません。それらは存在すると思いますが、今のところ3Vバッテリーしか見つけることができません)。数時間ごとに温度を節約するためのオンボードメモリがあり、後でダウンロードできる場合、それは理想的です(メモリに関する推奨事項があれば、私も興味があります)。「Ibutton」を購入できることは知っています


...申し訳ありませんが、私の実際の質問は次のとおりです。誰かが適切な低電力の軽量マイクロコントローラーを推奨できますか、それともArduinoを続行してそれを適応させようと思いますか?どんな助けでも本当に感謝しています!
2016年

2つの1.5Vバッテリーを直列に接続して、8MHzのATmega328を使用できます。その後、ArduinoライブラリとIDEを引き続き使用できます。
jfpoilpret 2016年

@ jfpoilpret、2AAは重すぎると思います。2032 3Vコインセルの方が良いかもしれません。
Dat Ha

2
プログラム方法によっては、ATmega328またはATtiny84または85の電流消費が非常に少なく、かなり長い間リチウムCR2032セルで動作する場合があります。ただし、回路(ATmelまたはその他)の消費電力を削減することは、かなり注意が必要です。
jfpoilpret

回答:


15

ボタン電池(CR2032)から給電されるATtiny85を使用する小さなトーチロケーターを作りました。次のようになります。

トーチロケーター

向こう側:

向こう側

現在の重量は5.9gです。バッテリーホルダーの重さは1.6gなので、より軽量なホルダー(おそらく絶縁用のプラスチックを少し使用し、バッテリーに直接はんだ付け)を作成することでそれを節約できます。チップソケットは少なくとも0.5gの重量があるため、プロセッサピンにはんだ付けすることによっても節約できます。つまり、3.8gに減っています。

ATtiny85には512バイトのEEPROMがあり、これを使用して読み取り値を記録できます。重量を節約しようとしているのかどうかはmillis()わかりませんが、既知の時間に開始した場合は、関数を使用して開始からのミリ秒を見つけることで、時間の妥当な見積もりを得ることができます。

数秒前にLEDを点滅させるものを少し前に作成しました。

LEDフラッシャー

それは似ています。プロセッサはそこにあり(チップソケットの下に逆さまに)、バッテリーはその下にあります。重さは6g。バッテリーは数年続きました、そしてそれは数秒ごとにLEDを点滅させています!

LEDの代わりに、サーミスタで温度を読み取ることができます。

数時間ごとに読み取りを行い、EEPROMに保存するようにプログラムできます。次に、(たとえば、2つのピンを結合することによって)指示されたときに、読み取り値を別のピンに(シリアル経由で)出力できます。

SMD(表面実装)デバイスを使用することで、より軽量化することができます。


コード

私のトーチロケーターのコードは以下です。興味深いのは、ほとんどの時間寝ているという事実です。また、ADCサンプリング中にスリープします。私の場合、LDR(光依存抵抗)を測定していますが、サーミスタを測定するためのコードは同様です。読み取り値を温度に変換するには、最後にいくつかの計算を行う必要があります。

// ATtiny85 torch detector
// Author: Nick Gammon
// Date: 25 February 2015

// ATMEL ATTINY 25/45/85 / ARDUINO
// Pin 1 is /RESET
//
//                  +-\/-+
// Ain0 (D 5) PB5  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1 
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//            GND  4|    |5  PB0 (D 0) pwm0
//                  +----+

/*

  Pin 2 (PB3) <-- LDR (GL5539) --> Pin 7 (PB2) <----> 56 k <----> Gnd

  Pin 5 (PB0) <---- LED ---> 100 R <-----> Gnd

*/


#include <avr/sleep.h>    // Sleep Modes
#include <avr/power.h>    // Power management
#include <avr/wdt.h>      // Watchdog timer

const byte LED = 0;          // pin 5 
const byte LDR_ENABLE = 3;   // pin 2
const byte LDR_READ = 1;     // Ain1 (PB2) pin 7
const int LIGHT_THRESHOLD = 200;  // Flash LED when darker than this

 // when ADC completed, take an interrupt 
EMPTY_INTERRUPT (ADC_vect);

// Take an ADC reading in sleep mode (ADC)
float getReading (byte port)
  {
  power_adc_enable() ;
  ADCSRA = bit (ADEN) | bit (ADIF);  // enable ADC, turn off any pending interrupt

  // set a2d prescale factor to 128
  // 8 MHz / 128 = 62.5 KHz, inside the desired 50-200 KHz range.

  ADCSRA |= bit (ADPS0) | bit (ADPS1) | bit (ADPS2); 

  if (port >= A0)
    port -= A0;

#if defined(__AVR_ATtiny85__)  
  ADMUX = (port & 0x07);  // AVcc   
#else   
  ADMUX = bit (REFS0) | (port & 0x07);  // AVcc   
#endif

  noInterrupts ();
  set_sleep_mode (SLEEP_MODE_ADC);    // sleep during sample
  sleep_enable();  

  // start the conversion
  ADCSRA |= bit (ADSC) | bit (ADIE);
  interrupts ();
  sleep_cpu ();     
  sleep_disable ();

  // reading should be done, but better make sure
  // maybe the timer interrupt fired 

  // ADSC is cleared when the conversion finishes
  while (bit_is_set (ADCSRA, ADSC))
    { }

  byte low  = ADCL;
  byte high = ADCH;

  ADCSRA = 0;  // disable ADC
  power_adc_disable();

  return (high << 8) | low;

  }  // end of getReading

// watchdog interrupt
ISR (WDT_vect) 
{
   wdt_disable();  // disable watchdog
}  // end of WDT_vect

#if defined(__AVR_ATtiny85__)  
  #define watchdogRegister WDTCR
#else
  #define watchdogRegister WDTCSR
#endif

void setup ()
  {
  wdt_reset();  
  pinMode (LED, OUTPUT);
  pinMode (LDR_ENABLE, OUTPUT);
  ADCSRA = 0;            // turn off ADC
  power_all_disable ();  // power off ADC, Timer 0 and 1, serial interface
  }  // end of setup

void loop ()
  {
  // power up the LDR, take a reading
  digitalWrite (LDR_ENABLE, HIGH);
  int value = getReading (LDR_READ);
  // power off the LDR
  digitalWrite (LDR_ENABLE, LOW);

  // if it's dark, flash the LED for 2 mS
  if (value < LIGHT_THRESHOLD)
    {
    power_timer0_enable ();
    delay (1);  // let timer reach a known point
    digitalWrite (LED, HIGH);
    delay (2); 
    digitalWrite (LED, LOW);
    power_timer0_disable ();
    }

  goToSleep ();
  }  // end of loop

void goToSleep ()
  {
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  noInterrupts ();       // timed sequence coming up

  // pat the dog
  wdt_reset();  

  // clear various "reset" flags
  MCUSR = 0;     
  // allow changes, disable reset, clear existing interrupt
  watchdogRegister = bit (WDCE) | bit (WDE) | bit (WDIF);
  // set interrupt mode and an interval (WDE must be changed from 1 to 0 here)
  watchdogRegister = bit (WDIE) | bit (WDP2) | bit (WDP1) | bit (WDP0);    // set WDIE, and 2 seconds delay

  sleep_enable ();       // ready to sleep
  interrupts ();         // interrupts are required now
  sleep_cpu ();          // sleep                
  sleep_disable ();      // precaution
  }  // end of goToSleep 

点滅する「もの」を点滅させるために、555タイマーチップを使用した方がいいのではないでしょうか。私はATtinyを使うのはやや無駄だと思います。
Dat Ha

2
低消費電力を目指していました。プロセッサはほとんどの時間スリープしてから、LEDを1ミリ秒ほど点滅させます。
Nick Gammon

ありがとう!これを使用することは可能に見える、それを設定してプログラムする方法を学ぶことに行くでしょう。
2016年

「LEDの代わりに、サーミスタで温度を読み取ることができます」代わりに、オンボードの温度センサーであるADCチャネル15を読み取ることができます。[ただし、感度や精度はそれほど高くありません。]
James Waldby-jwpat7

あなたのトーチファインダーは素晴らしいデザインであり、あなたが行った消費電力の見積もりは、Ardunioの「必要なだけの技術者」の精神に基づいています。すべてが私の心のコックルを温めました(それらがどこにあっても)。
cjs 2017

8

私は個人的にATtiny 45/85を提案します。これは、5つのGPIOを備えたかなり小さなAVRです。Arduino IDEでプログラムして、ArduinoをISPとして使用できます。独自のカスタムPCBを設計できる場合、ATtinyのSMDバージョンは小さく、低く、コンパクトです。ATtiny機能を作るための総回路も最小限です。

ここに画像の説明を入力してください

また、低いクロック速度(0〜4MHz)では、1.8Vという低い電圧でATtinyに電力を供給することができます。おそらく1.5Vで実行することもできますが、これは完全にはお勧めできません。安全を確保したい場合は、3Vコインセルは小さくて平らで、おそらく何年も使用できます。また、特にコントロールできない動物にマウントする場合は、多くのリスクがあるリポに比べて少し安全です。

ここに画像の説明を入力してください

可能であればSMDコンポーネントもお勧めします。すべてのコンポーネントを低くすることができ、監視している人や動物の皮膚を傷つけたり、傷つけたりしません。


私たち2人は同じ考えを持っていたようです!
Nick Gammon

ありがとう!! これは見栄えがよく、本当に助けに感謝します!最初の回路からマイクロコントローラなどの基本的なセットアップ方法を学ぼうと思いますが、それが機能するようになったら、おそらくあなたが提案したようにSMDコンポーネントに変更されます。現実的には、それを十分に小さくするためにそれを行う必要があると思います。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.