bardzo lekki mikrokontroler małej mocy z pamięcią?

9

Zbudowałem kilka projektów za pomocą Arduino. W przypadku nowego projektu chcę rejestrować temperaturę powierzchni skóry w funkcji czasu (może kilka razy dziennie) i ewentualnie inne łatwe do uzyskania informacje, takie jak napięcie.

Muszę sprawić, aby wszystko było tak małe i lekkie, jak to możliwe (ponieważ mierzyłoby to temperaturę skóry u małego ssaka), tj. Poniżej 5 g, lżejsze, jeśli to możliwe, najlepiej 3 g, w tym baterię, aby nie zakłócało 50- 100g zwierzę za dużo.

Czytałem, że można zmienić arduino pro mini tak, aby zużywał mniej prądu, pozbywając się regulatora napięcia? ale może rozsądniej jest całkowicie zmienić i nauczyć się programować inny typ mikrokontrolera, który ktoś mógłby polecić? Musi istnieć możliwość obsługi go bezpośrednio z lekkiego ogniwa monetowego lub podobnej lekkiej baterii. (Nie jestem również pewien, jak znaleźć lekką baterię 3,3 V dla arduino pro mini, chyba istnieją, ale do tej pory mogę znaleźć tylko baterie 3 V.) Jeśli ma wbudowaną pamięć do oszczędzania temperatury co kilka godzin, którą można pobrać później, byłoby idealnie (byłbym również zainteresowany, gdyby ktoś miał zalecenia dotyczące pamięci). Wiem, że można kupić „Ibutton”

SH
źródło
... przepraszam, moje rzeczywiste pytanie brzmi: czy ktoś mógłby polecić odpowiedni lekki mikrokontroler o niskiej mocy, czy uważasz, że powinienem kontynuować arduino i spróbować go dostosować? Każda pomoc jest na prawdę doceniana!
SH
Możesz użyć ATmega328 o częstotliwości 8 MHz, zasilanej szeregowo dwiema bateriami 1,5 V. Następnie możesz nadal korzystać z bibliotek Arduino i IDE.
jfpoilpret
@jfpoilpret, 2AA byłoby zbyt ciężkie. Ogniwo monety 2032 3V mogłoby być lepsze.
Dat Ha
2
W zależności od tego, jak go zaprogramujesz, ATmega328 lub ATtiny84 lub 85 może mieć bardzo niewielki pobór prądu i pracować z ogniwem litowym CR2032 przez dłuższy czas. Jednak zmniejszenie zużycia energii przez obwód (ATmel lub dowolny inny) może być dość trudne.
jfpoilpret

Odpowiedzi:

15

Zrobiłem mały lokalizator pochodni, który wykorzystywał ATtiny85 zasilany z komórki guzikowej (CR2032). To wygląda tak:

Lokalizator pochodni

Druga strona:

Druga strona

To waży obecnie 5,9 g. Uchwyt baterii waży 1,6 g, więc możesz to zaoszczędzić, wykonując bardziej lekki uchwyt (być może kawałek plastiku do izolacji i lutowanie bezpośrednio do akumulatora). Gniazdo mikroukładu waży co najmniej 0,5 g, więc możesz to również zaoszczędzić, lutując do pinów procesora. Sprowadzamy więc do 3,8 g.

ATtiny85 ma 512 bajtów EEPROM, których można użyć do zarejestrowania odczytów. Nie jestem pewien co do zegara, jeśli próbujesz zaoszczędzić na wadze, ale jeśli uruchomisz go w znanym momencie, możesz mieć rozsądny szacunkowy czas, używając millis()funkcji do znalezienia milisekund od uruchomienia.

Jakiś czas temu zrobiłem inny, który co kilka sekund miga diodą LED:

Migacz LED

To jest podobne. Procesor jest tam (do góry nogami pod gniazdem chipa), a akumulator jest pod spodem. To waży 6 g. Bateria przetrwała kilka lat, a to miga diodą LED co kilka sekund!

Zamiast diody LED możesz mieć termistor do odczytu temperatury.

Możesz zaprogramować go tak, aby dokonywał odczytu co kilka godzin i zapisywał go w EEPROM. Następnie po otrzymaniu instrukcji (np. Łącząc kilka pinów) może przesłać odczyty na inny pin (przez port szeregowy).

Możesz zaoszczędzić więcej wagi, używając urządzeń SMD (montowanych powierzchniowo), a być może za pomocą niewielkiej płytki drukowanej, którą możesz wymyślić.


Kod

Kod mojego lokalizatora pochodni znajduje się poniżej. Interesujący jest fakt, że przez większość czasu śpi. Również śpi podczas próbkowania ADC. Chociaż w moim przypadku mierzę LDR (rezystor zależny od światła), kod pomiaru termistora byłby podobny. Musisz tylko wykonać kilka obliczeń na końcu, aby zmienić odczyt w temperaturę.

// 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 
Nick Gammon
źródło
jeśli chodzi o flashowanie „rzeczy”, czy nie lepiej byłoby użyć układu 555 timera? Uważam, że używanie ATtiny jest trochę marnotrawstwem.
Dat Ha
2
Chciałem uzyskać niskie zużycie energii. Procesor śpi przez większość czasu, a następnie miga diodą LED przez około milisekundę.
Nick Gammon
dzięki! wygląda na to, że można tego użyć, będzie musiał nauczyć się konfigurować i programować.
SH
Re „Zamiast diody LED możesz mieć termistor do odczytu temperatury”, zamiast tego można odczytać kanał ADC 15, czujnik temperatury na pokładzie. [Jednak nie jest to bardzo czułe ani dokładne.]
James Waldby - jwpat7
Twoja wyszukiwarka latarek jest cudownym projektem, a szacowane zużycie energii jest w duchu „inżyniera tyle, ile potrzebujesz” ducha Ardunio. Wszystko to rozgrzało sercówki mojego serca (gdziekolwiek są).
cjs
8

Osobiście poleciłbym ATtiny 45/85. To właściwie mały AVR z 5 GPIO. Możesz go zaprogramować za pomocą Arduino IDE i używać Arduino jako ISP. Jeśli możesz zaprojektować własną płytkę drukowaną, wersja ATtiny SMD jest mała, niska i kompaktowa. Całkowity obwód do wykonania funkcji ATtiny jest również minimalny.

wprowadź opis zdjęcia tutaj

Ponadto, przy niskiej częstotliwości zegara (0-4 MHz), możesz zasilać ATtiny napięciem tak niskim jak 1,8 V. Prawdopodobnie mógłbyś nawet uruchomić przy 1,5 V, ale nie jest to całkowicie zalecane. Jeśli chcesz być bezpieczny, ogniwo na monety 3 V będzie małe, płaskie i może trwać prawdopodobnie wiele lat. Jest również trochę bezpieczniejszy w porównaniu do liposów, które wiążą się z dużym ryzykiem, zwłaszcza jeśli montuje się je na zwierzęciu, którego tak naprawdę nie można kontrolować.

wprowadź opis zdjęcia tutaj

Poleciłbym również komponenty SMD, jeśli to możliwe. Pozwala to obniżyć wszystkie elementy i nie boli ani nie porywa skóry monitorowanej osoby / zwierzęcia.

Dat Ha
źródło
Wygląda na to, że oboje mieliśmy ten sam pomysł!
Nick Gammon
dzięki!! to wygląda świetnie, naprawdę doceniam pomoc! Spróbuję nauczyć się podstaw konfigurowania mikrokontrolera itp. Od pierwszego obwodu i kiedy już zacznę działać, prawdopodobnie zmieni się w komponenty SMD, tak jak sugerowałeś. Myślę, że realistycznie będę musiał to zrobić, aby było wystarczająco małe.
SH