hafızalı çok hafif düşük güçlü mikrodenetleyici?


9

Arduino kullanarak birkaç proje yaptım. Yeni bir proje için cilt yüzey sıcaklığını zamana karşı (belki de günde sadece birkaç kez) ve voltaj gibi bilgi elde etmek için kolayca kaydetmek istiyorum.

Her şeyi mümkün olduğunca küçük ve hafif yapmalıyım (küçük bir memelide cilt sıcaklığını ölçeceği için), yani 5g'nin altında, mümkünse daha hafif, pil dahil olmak üzere ideal 3g, böylece 50- 100g hayvan çok fazla.

Arduino pro mini'yi voltaj regülatöründen kurtularak daha az akım kullanmanın mümkün olabileceğini okudum? ama belki de tamamen değiştirmek ve birisinin önerebileceği başka bir tür mikrodenetleyici programlamayı öğrenmek daha mantıklıdır? Doğrudan hafif bir madeni para hücresinden veya benzer hafif bir pilden çalıştırmak mümkün olmalıdır. (Ayrıca arduino pro mini için hafif bir 3.3V pil nasıl bulacağından emin değilim, sanırım varlar ama şimdiye kadar sadece 3V pil bulabiliyorum). Daha sonra indirilebilecek birkaç saatte bir sıcaklığı kaydetmek için yerleşik bellek varsa, bu ideal olacaktır (herkesin bellek için önerileri varsa da ilgilenirim). Bir "Ibutton" satın almanın mümkün olduğunu biliyorum


... özür dilerim, asıl sorum şu: Birisi uygun bir düşük güçlü hafif mikrodenetleyici önerebilir mi yoksa arduino ile devam etmeli ve uyarlamaya çalışmalı mıyım? Herhangi bir yardım gerçekten takdir!
SH

Seri olarak iki adet 1.5V pil ile çalışan 8MHz'de bir ATmega328 kullanabilirsiniz. Daha sonra Arduino kütüphanelerini ve IDE'yi kullanmaya devam edebilirsiniz.
jfpoilpret

@jfpoilpret, 2AA bence çok ağır olurdu. Bir 2032 3V sikke hücresi daha iyi olabilir.
Dat Ha

2
Nasıl programladığınıza bağlı olarak, bir ATmega328 veya ATtiny84 veya 85 çok hafif akım tüketimine sahip olabilir ve bir süre lityum CR2032 hücresiyle çalışabilir. Bununla birlikte, bir devrenin (ATmel veya başka herhangi bir) güç tüketimini azaltmak oldukça zor olabilir.
jfpoilpret

Yanıtlar:


15

Bir düğme hücresinden (CR2032) güç alan bir ATtiny85 kullanan küçük bir meşale bulucu oluşturdum. Şöyle görünüyor:

Torç bulucu

Diğer taraf:

Diğer taraf

Şu anda 5,9 g ağırlığında. Pil tutucu 1,6 g ağırlığındadır, böylece daha hafif bir tutucu (belki de yalıtım için biraz plastik ve doğrudan pile lehimleme) yaparak tasarruf edebilirsiniz. Çip soketi en az 0,5 g ağırlığındadır, böylece işlemci pimlerine lehimleyerek de tasarruf edebilirsiniz. Yani 3.8g'a düştük.

ATtiny85, okumaları günlüğe kaydetmek için kullanabileceğiniz 512 bayt EEPROM'a sahiptir. Kilo almaya çalışıyorsanız bir saat hakkında emin değilim, ancak bilinen bir zamanda başlatırsanız, başlangıçtan bu millis()yana miliiseconds bulmak için işlevi kullanarak süreyi makul bir şekilde tahmin edebilirsiniz .

Bir süre önce başka bir tane yaptım, bu da birkaç saniyede bir LED yanıp sönüyor:

LED flaşör

Bu benzer. İşlemci orada (baş aşağı çip soket altında) ve pil altta. Bu 6g ağırlığında. Pil birkaç yıl sürdü ve bu her birkaç saniyede bir LED yanıp sönüyor!

LED yerine sıcaklığı okumak için bir termistörünüz olabilir.

Her birkaç saatte bir okuma almak ve EEPROM'a kaydetmek için programlayabilirsiniz. Daha sonra talimat verildiğinde (örn. Birkaç pime katılarak) okumaları başka bir pime (seri üzerinden) çıkarabilir.

SMD (yüzeye monte) cihazları kullanarak ve belki de oluşturabileceğiniz küçük bir devre kartı kullanarak daha fazla ağırlık tasarrufu yapabilirsiniz.


kod

Meşale konum belirleyicimin kodu aşağıda. İlginç olan, çoğu zaman uyuduğu gerçeğidir. Ayrıca ADC örneklemesi sırasında uyur. Her ne kadar benim durumumda bir LDR (ışığa bağlı direnç) ölçsem de, bir termistörün ölçüm kodu benzer olacaktır. Okumayı bir sıcaklığa dönüştürmek için sonunda bazı hesaplamalar yapmanız yeterlidir.

// 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 

yanıp sönen led "şey" için, bir 555 zamanlayıcı çip kullanmak daha iyi olmaz mıydı? ATtiny kullanarak biraz israf buluyorum.
Dat Ha

2
Düşük güç tüketimi için gidiyordum. İşlemci çoğu zaman uyur ve daha sonra LED'i bir milisaniye kadar yanıp söner.
Nick Gammon

Teşekkürler! Bunu kullanmak mümkün görünüyor, nasıl kurulacağını ve programlanacağını öğrenecek.
SH

“LED yerine sıcaklığı okumak için bir termistöre sahip olabilirsiniz”, bunun yerine dahili sıcaklık sensörü olan ADC kanalı 15'i okuyabilirsiniz. [Ancak son derece hassas veya doğru değil.]
James Waldby - jwpat7

Meşale bulucunuz harika bir tasarım parçası ve yaptığınız güç tüketimi tahmini, Ardunio'nun ruhu "ihtiyacınız olduğu kadar mühendis" ruhunda. Her şey kalbimin horozlarını ısıttı (nerede olursa olsun).
cjs

8

Ben şahsen ATtiny 45/85 öneriyoruz. 5 GPIO'lu küçük bir AVR. Arduino IDE ile programlayabilir ve Arduino'yu ISS olarak kullanabilirsiniz. Kendi özel PCB'nizi tasarlayabiliyorsanız, ATtiny'nin SMD sürümü küçük, düşük ve kompakttır. ATtiny işlevini yapmak için toplam devre de minimumdur.

resim açıklamasını buraya girin

Ayrıca, düşük saat hızında (0-4MHz), ATtiny'ye 1.8V kadar düşük bir voltajda güç sağlayabilirsiniz. Muhtemelen 1.5V'de bile çalıştırabilirsiniz, ancak bu tamamen önerilmez. Güvende olmak istiyorsanız, 3V'luk bir sikke hücresi küçük, düz olacaktır ve muhtemelen uzun yıllar sürebilir. Ayrıca, özellikle gerçekten kontrol edemediğiniz bir hayvana monte ederseniz, birçok riski olan lipozlara kıyasla biraz daha güvenlidir.

resim açıklamasını buraya girin

Mümkünse SMD bileşenlerini de öneririm. Tüm bileşenin daha düşük olmasına izin verir ve izlediğiniz kişinin / hayvanın derisine zarar vermez veya çizmez.


İkimiz de aynı fikre sahipmişiz gibi görünüyor!
Nick Gammon

Teşekkürler!! Bu harika görünüyor, gerçekten yardımı takdir ediyorum! İlk kontrolden mikrodenetleyici vb. Gerçekçi olarak bunu yeterince küçük yapmak için yapmam gerekecek.
SH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.