ไมโครคอนโทรลเลอร์ที่มีน้ำหนักเบาและมีหน่วยความจำน้อยมาก?


9

ฉันได้สร้างโครงการสองสามโครงการที่ใช้ Arduino สำหรับโครงการใหม่ฉันต้องการบันทึกอุณหภูมิพื้นผิวเทียบกับเวลา (อาจจะวันละสองสามครั้ง) และอาจเป็นเรื่องง่ายที่จะได้รับข้อมูลเช่นแรงดันไฟฟ้า

ฉันต้องทำให้ทุกอย่างเล็กและเบาที่สุดเท่าที่จะเป็นไปได้ (เพราะมันจะทำการวัดอุณหภูมิผิวสัตว์เลี้ยงลูกด้วยนมตัวเล็ก) เช่นต่ำกว่า 5 กรัมเบากว่าถ้าเป็นไปได้ควรมี 3g รวมทั้งแบตเตอรี่ด้วย สัตว์ 100 กรัมมากเกินไป

ฉันอ่านมันเป็นไปได้ไหมที่จะเปลี่ยน arduino pro mini ให้ใช้กระแสไฟน้อยลงโดยกำจัดตัวควบคุมแรงดันไฟฟ้า แต่บางทีมันอาจจะเหมาะสมที่จะเปลี่ยนแปลงอย่างสมบูรณ์และเรียนรู้ที่จะเขียนโปรแกรมไมโครคอนโทรลเลอร์ชนิดอื่นที่ใครบางคนแนะนำได้? มันจะต้องเป็นไปได้ที่จะใช้งานได้โดยตรงจากเซลล์แบบเหรียญที่มีน้ำหนักเบาหรือแบตเตอรี่ที่มีน้ำหนักเบาที่คล้ายกัน (ฉันยังไม่แน่ใจว่าจะหาแบตเตอรี่ 3.3V น้ำหนักเบาสำหรับ arduino pro mini ได้อย่างไรฉันเดาว่ามันมีอยู่ แต่ฉันสามารถหาแบตเตอรี่ 3V ได้เท่านั้น) หากมีหน่วยความจำออนบอร์ดบันทึกอุณหภูมิทุกสองสามชั่วโมงซึ่งสามารถดาวน์โหลดได้ในภายหลังซึ่งจะเหมาะ (ฉันจะสนใจถ้าใครมีคำแนะนำสำหรับหน่วยความจำ) ฉันรู้ว่าเป็นไปได้ที่จะซื้อ "Ibutton"


... ขออภัยคำถามจริงของฉันคือ: ใครช่วยแนะนำไมโครคอนโทรลเลอร์น้ำหนักเบาที่ใช้พลังงานต่ำที่เหมาะสมหรือคุณคิดว่าฉันควรดำเนินการต่อกับ Arduino และลองปรับมันได้หรือไม่ ความช่วยเหลือใด ๆ ที่เป็นที่นิยมจริงๆ!
SH

คุณสามารถใช้ ATmega328 ที่ 8MHz ขับเคลื่อนด้วยแบตเตอรี่ 1.5V สองก้อนในซีรีย์ จากนั้นคุณสามารถดำเนินการต่อโดยใช้ห้องสมุด Arduino และ IDE
jfpoilpret

@jfpoilpret, 2AA จะหนักเกินไปที่ฉันคิด เซลล์เหรียญ 2032 3V น่าจะดีกว่า
Dat Ha

2
ขึ้นอยู่กับว่าคุณจะตั้งโปรแกรมอย่างไร ATmega328 หรือ ATtiny84 หรือ 85 อาจมีการใช้กระแสไฟน้อยมากและทำงานกับเซลล์ลิเธียม CR2032 ในบางเวลา อย่างไรก็ตามการลดการใช้พลังงานของวงจร (ATmel หรืออื่น ๆ ) สามารถค่อนข้างยุ่งยาก
jfpoilpret

คำตอบ:


15

ฉันสร้างตัวระบุตำแหน่งไฟฉายขนาดเล็กซึ่งใช้ ATtiny85 ขับเคลื่อนจากปุ่มเซลล์ (CR2032) ดูเหมือนว่านี้:

ที่ตั้งคบเพลิง

ด้านอื่น ๆ:

ด้านอื่น ๆ

ที่ปัจจุบันมีน้ำหนัก 5.9 กรัม ที่ใส่แบตเตอรี่มีน้ำหนัก 1.6 กรัมดังนั้นคุณสามารถประหยัดได้โดยใช้ที่ยึดที่มีน้ำหนักเบามากขึ้น (อาจเป็นพลาสติกสำหรับฉนวนกันความร้อนและบัดกรีกับแบตเตอรี่โดยตรง) ซ็อกเก็ตชิปมีน้ำหนักอย่างน้อย 0.5 กรัมดังนั้นคุณสามารถบันทึกได้ด้วยการบัดกรีที่ขาโปรเซสเซอร์ ดังนั้นเราจึงลดลงเหลือ 3.8 กรัม

ATtiny85 มี EEPROM 512 ไบต์ซึ่งคุณสามารถใช้เพื่อบันทึกการอ่าน ฉันไม่แน่ใจเกี่ยวกับนาฬิกาถ้าคุณพยายามที่จะลดน้ำหนัก แต่ถ้าคุณเริ่มต้นในเวลาที่รู้จักกันคุณสามารถประเมินเวลาได้อย่างสมเหตุสมผลโดยใช้millis()ฟังก์ชั่นเพื่อค้นหา miliiseconds ตั้งแต่เริ่มต้น

ฉันทำอีกหนึ่งในขณะที่แฟลช LED ทุกสองสามวินาที:

กะพริบ LED

นั่นคือที่คล้ายกัน โปรเซสเซอร์มี (คว่ำลงใต้ซ็อกเก็ตชิป) และแบตเตอรี่อยู่ด้านล่าง ที่มีน้ำหนัก 6 กรัม แบตเตอรี่ใช้งานได้สองสามปีและนั่นทำให้ LED กะพริบทุกสองสามวินาที!

แทนที่จะเป็น LED คุณอาจมีเทอร์มิสเตอร์เพื่ออ่านอุณหภูมิ

คุณสามารถตั้งโปรแกรมให้อ่านทุกสองสามชั่วโมงและบันทึกลงใน EEPROM จากนั้นเมื่อได้รับคำแนะนำ (เช่นโดยการรวมพินสองสามอัน) ก็สามารถส่งออกการอ่านไปยังพินอื่น (ผ่านทางอนุกรม)

คุณสามารถลดน้ำหนักได้มากขึ้นด้วยการใช้อุปกรณ์ 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 เป็นมิลลิวินาทีหรือมากกว่านั้น
Nick Gammon

ขอบคุณ! ดูเป็นไปได้ที่จะใช้สิ่งนี้จะมีการเรียนรู้วิธีการตั้งค่าและโปรแกรม
SH

เรื่อง“ แทนที่จะเป็น LED คุณสามารถมีเทอร์มิสเตอร์เพื่ออ่านอุณหภูมิ” ได้ แต่สามารถอ่าน ADC channel 15, เซ็นเซอร์อุณหภูมิออนบอร์ดแทน [อย่างไรก็ตามมันไม่มีความละเอียดอ่อนหรือแม่นยำสูง]
James Waldby - jwpat7

ตัวค้นหาไฟฉายของคุณเป็นชิ้นส่วนที่ยอดเยี่ยมในการออกแบบและการประเมินการใช้พลังงานที่คุณทำนั้นมีอยู่ในจิตวิญญาณของ "วิศวกรมากเท่าที่คุณต้องการ" จิตวิญญาณของ Ardunio ทุกสิ่งทำให้แมลงสาบในใจฉันอบอุ่น (ไม่ว่าจะอยู่ที่ไหน)
cjs

8

ฉันจะขอแนะนำ ATtiny 45/85 มันเป็น AVR ขนาดเล็กที่มี 5 GPIO คุณสามารถตั้งโปรแกรมด้วย Arduino IDE และใช้ Arduino เป็น ISP หากคุณสามารถออกแบบ PCB ของคุณเอง ATtiny รุ่น SMD มีขนาดเล็กต่ำและกะทัดรัด วงจรรวมเพื่อทำให้ฟังก์ชั่น ATtiny นั้นน้อยที่สุด

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ที่ความเร็วสัญญาณนาฬิกาต่ำ (0-4MHz) คุณสามารถจ่ายไฟ ATtiny ที่แรงดันไฟฟ้าต่ำเพียง 1.8V คุณอาจเรียกใช้ด้วยความเร็ว 1.5V แต่ไม่แนะนำทั้งหมด หากคุณต้องการความปลอดภัยเซลล์เหรียญ 3V จะมีขนาดเล็กแบนและอาจคงอยู่นานหลายปี มันค่อนข้างปลอดภัยกว่าเมื่อเทียบกับ lipos ที่มีความเสี่ยงมากโดยเฉพาะถ้าคุณติดมันบนสัตว์ที่คุณไม่สามารถควบคุมได้จริงๆ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันจะแนะนำส่วนประกอบ SMD ถ้าเป็นไปได้ มันช่วยให้ส่วนประกอบทั้งหมดลดลงและไม่ทำให้เจ็บหรือทำให้ผิวหนังของคน / สัตว์ที่คุณกำลังติดตามตรวจสอบอยู่


ดูเหมือนว่าเราทั้งคู่มีความคิดเดียวกัน!
Nick Gammon

ขอบคุณ !! ดูดีมากขอบคุณมากสำหรับความช่วยเหลือ! ฉันจะพยายามเรียนรู้พื้นฐานของวิธีการตั้งค่าไมโครคอนโทรลเลอร์และอื่น ๆ จากวงจรแรกและเมื่อฉันทำงานมันอาจจะเปลี่ยนเป็นส่วนประกอบ SMD ตามที่คุณแนะนำ ฉันคิดว่าแนบเนียนฉันจะต้องทำอย่างนั้นเพื่อทำให้มันเล็กพอ
SH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.