मेमोरी के साथ बहुत हल्का कम पावर माइक्रोकंट्रोलर?


9

मैंने arduino का उपयोग करके कुछ परियोजनाओं का निर्माण किया है। एक नई परियोजना के लिए मैं त्वचा की सतह के तापमान बनाम समय (शायद प्रति दिन कुछ ही समय) लॉग करना चाहता हूं और संभवतः अन्य जानकारी जैसे वोल्टेज प्राप्त करना आसान है।

मुझे हर चीज को जितना संभव हो उतना छोटा और हल्का बनाने की जरूरत है (क्योंकि यह एक छोटे स्तनपायी पर त्वचा के तापमान को मापता है), यानी 5 जी से नीचे, यदि संभव हो तो हल्का, बैटरी सहित आदर्श रूप से 3 जी, ताकि यह 50- को परेशान न करे। 100 ग्राम पशु बहुत अधिक।

मैंने पढ़ा कि वोल्टेज रेगुलेटर से छुटकारा पाने के लिए कम वर्तमान का उपयोग करने के लिए आर्डिनो प्रो मिनी को बदलना संभव हो सकता है? लेकिन शायद यह पूरी तरह से बदलने के लिए अधिक समझदार है और किसी अन्य प्रकार के माइक्रोकंट्रोलर को प्रोग्राम करना सीख सकता है जिसे कोई सुझा सकता है? इसे सीधे हल्के सिक्का सेल या इसी तरह की हल्की बैटरी से संचालित करना संभव होगा। (मुझे यह भी पता नहीं है कि आर्डिनो प्रो मिनी के लिए हल्की 3.3 वी बैटरी कैसे मिल सकती है, मुझे लगता है कि वे मौजूद हैं लेकिन मैं अब तक केवल 3 वी बैटरी पा सकता हूं)। यदि इसमें हर कुछ घंटों में तापमान को बचाने के लिए मेमोरी ऑनबोर्ड है जिसे बाद में डाउनलोड किया जा सकता है जो आदर्श होगा (मुझे भी दिलचस्पी होगी अगर किसी के पास मेमोरी के लिए सिफारिशें हैं)। मुझे पता है कि "इबटन" खरीदना संभव है


... क्षमा करें, मेरा वास्तविक सवाल यह है: क्या कोई उपयुक्त कम संचालित हल्के माइक्रोकंट्रोलर की सिफारिश कर सकता है, या आपको लगता है कि मुझे arduino के साथ जारी रखना चाहिए और इसे अनुकूलित करने का प्रयास करना चाहिए? कोई भी मदद सचमुच सराहनीय होगी!
एसएच

आप श्रृंखला में दो 1.5V बैटरी से संचालित 8MHz पर ATmega328 का उपयोग कर सकते हैं। फिर आप Arduino पुस्तकालयों और IDE का उपयोग जारी रख सकते हैं।
jfpoilpret

@jfpoilpret, 2AA मुझे लगता है कि बहुत भारी होगा। एक 2032 3V सिक्का सेल बेहतर हो सकता है।
डाट हा

2
आप इसे कैसे प्रोग्राम करते हैं, इस पर निर्भर करते हुए, ATmega328 या ATtiny84 या 85 में बहुत हल्का वर्तमान खपत हो सकता है और काफी समय के लिए लिथियम CR2032 सेल के साथ काम कर सकता है। हालांकि, एक सर्किट (एटीमेल या किसी अन्य) की बिजली की खपत को कम करना मुश्किल हो सकता है।
jfpoilpret

जवाबों:


15

मैंने एक छोटा मशाल लोकेटर बनाया, जिसमें बटन-सेल (CR2032) से संचालित ATtiny85 का उपयोग किया गया था। यह इस तरह दिख रहा है:

मशाल लोकेटर

दूसरा पहलु:

दूसरा पहलु

जिसका वर्तमान में वजन 5.9 ग्राम है। बैटरी-धारक का वजन 1.6g है ताकि आप अधिक प्रकाश-भार धारक (शायद इन्सुलेशन के लिए थोड़ा सा प्लास्टिक, और बैटरी को सीधे टांका लगाकर) को बचा सकें। चिप सॉकेट का वजन कम से कम 0.5 ग्राम होता है, जिससे आप प्रोसेसर पिन को टांका लगाकर बचा सकते हैं। तो हम 3.8 जी से नीचे हैं।

ATtiny85 में EEPROM के 512 बाइट्स हैं, जिनका उपयोग आप रीडिंग लॉग करने के लिए कर सकते हैं। अगर आप वजन कम करने की कोशिश कर रहे हैं तो मुझे एक घड़ी के बारे में निश्चित नहीं है, लेकिन अगर आप इसे एक ज्ञात समय पर शुरू करते हैं, तो millis()स्टार्टअप के बाद से मिलिसेकंड खोजने के लिए फ़ंक्शन का उपयोग करके आप समय का उचित अनुमान लगा सकते हैं ।

मैंने कुछ समय पहले एक और बनाया था जो हर दो सेकंड में एक एलईडी फ्लैश करता है:

एलईडी फ्लैशर

वह समान है। प्रोसेसर वहाँ है (चिप सॉकेट के नीचे उल्टा) और बैटरी नीचे है। जिसका वजन 6g है। बैटरी कुछ वर्षों तक चली है, और वह प्रत्येक सेकंड में एक एलईडी फ्लैश कर रही है!

एलईडी के बजाय तापमान को पढ़ने के लिए आपके पास एक थर्मिस्टर हो सकता है।

आप इसे हर कुछ घंटों में पढ़ने के लिए प्रोग्राम कर सकते हैं और इसे EEPROM में सहेज सकते हैं। फिर जब निर्देश दिया (उदाहरण के लिए, एक जोड़ी पिन के साथ) यह रीडिंग को दूसरे पिन (सीरियल के माध्यम से) में आउटपुट कर सकता है।

आप SMD (सरफेस माउंटेड) डिवाइसों का उपयोग करके अधिक वजन बचा सकते हैं, और शायद एक छोटे सर्किट बोर्ड का उपयोग करके आप बना सकते हैं।


कोड

मेरे मशाल लोकेटर के लिए कोड नीचे है। ब्याज की तथ्य यह है कि यह ज्यादातर समय सोता है। इसके अलावा यह एडीसी नमूने के दौरान सोता है। हालांकि मेरे मामले में मैं एक 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 टाइमर चिप का उपयोग करना बेहतर नहीं होगा? मुझे लगता है कि एटीटी का उपयोग कुछ हद तक बेकार है।
दत्त हा

2
मैं कम बिजली की खपत के लिए जा रहा था। प्रोसेसर ज्यादातर समय सोता है, और फिर एक या एक मिलीसेकंड के लिए एलईडी फ्लैश करता है।
निक गैमन

धन्यवाद! इस का उपयोग करना संभव है, यह सीखने और इसे स्थापित करने के तरीके पर जाना होगा।
एसएच

पुन: "एलईडी के बजाय आपके पास तापमान को पढ़ने के लिए थर्मिस्टर हो सकता है", कोई इसके बजाय एडीसी चैनल 15, ऑन-बोर्ड तापमान सेंसर पढ़ सकता है। [हालाँकि यह अत्यधिक संवेदनशील या सटीक नहीं है।]
जेम्स वाल्डबी - jwpat7

आपका मशाल खोजक डिज़ाइन का एक अद्भुत टुकड़ा है और आपके द्वारा किया गया बिजली की खपत का अनुमान "इंजीनियर की भावना में उतना ही है जितना आपको अर्दुनियो की भावना"। पूरी बात ने मेरे दिल के लंड को गर्म कर दिया (जहाँ भी हो)।
cjs

8

मैं एक एटीटीनी 45/85 का सुझाव दूंगा। यह 5 GPIO के साथ बहुत छोटा AVR है। आप इसे Arduino IDE के साथ प्रोग्राम कर सकते हैं और Arduino को ISP के रूप में उपयोग कर सकते हैं। यदि आप अपने स्वयं के कस्टम पीसीबी को डिज़ाइन कर सकते हैं, तो एटीटीनी का एसएमडी संस्करण छोटा, कम और कॉम्पैक्ट है। ATtiny फ़ंक्शन बनाने के लिए कुल सर्किट भी न्यूनतम है।

यहां छवि विवरण दर्ज करें

इसके अलावा, कम घड़ी की गति (0-4MHz) पर, आप एटीवी को एक वोल्टेज पर 1.8 वी के रूप में कम कर सकते हैं। आप शायद इसे 1.5V पर भी चला सकते हैं, लेकिन यह पूरी तरह से अनुशंसित नहीं है। यदि आप सुरक्षित रहना चाहते हैं, तो एक 3V सिक्का सेल छोटा, सपाट होगा, और यह संभवतः कई वर्षों तक चल सकता है। यह लिपो की तुलना में थोड़ा अधिक सुरक्षित है, जिसमें कई जोखिम हैं, खासकर यदि आप इसे एक जानवर पर माउंट करते हैं जिसे आप वास्तव में नियंत्रित नहीं कर सकते हैं।

यहां छवि विवरण दर्ज करें

यदि संभव हो तो मैं एसएमडी घटकों की भी सिफारिश करूंगा। यह सभी घटक को कम करने देता है और यह उस व्यक्ति / जानवर की त्वचा को चोट नहीं पहुंचाता है, न ही आपकी निगरानी कर रहा है।


लगता है कि हम दोनों का विचार समान था!
निक गैमन

धन्यवाद!! यह बहुत अच्छा लग रहा है, वास्तव में मदद की सराहना करते हैं! मैं पहले सर्किट से माइक्रोकंट्रोलर आदि को सेट करने के तरीके की मूल बातें सीखने की कोशिश करूँगा और एक बार जब मैं इसे काम कर लूंगा, तो संभवतः आपके द्वारा सुझाए गए एसएमडी घटकों में बदल जाएगा। मुझे लगता है कि वास्तविक रूप से मुझे यह करने की आवश्यकता होगी कि मैं इसे काफी छोटा बना सकूं।
एसएच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.