vi điều khiển công suất thấp rất nhẹ với bộ nhớ?


9

Tôi đã xây dựng một vài dự án bằng cách sử dụng arduino. Đối với một dự án mới, tôi muốn ghi lại nhiệt độ bề mặt da theo thời gian (có lẽ chỉ vài lần mỗi ngày) và có thể dễ dàng có được thông tin khác như điện áp.

Tôi cần làm mọi thứ nhỏ và nhẹ nhất có thể (vì nó sẽ đo nhiệt độ da trên một động vật có vú nhỏ), tức là dưới 5g, nhẹ hơn nếu có thể, lý tưởng là 3g, bao gồm cả pin, để nó không làm đảo lộn 50- 100g thú quá nhiều.

Tôi đọc có thể thay đổi arduino pro mini để sử dụng ít dòng điện hơn bằng cách loại bỏ bộ điều chỉnh điện áp? nhưng có lẽ hợp lý hơn khi thay đổi hoàn toàn và học cách lập trình một loại vi điều khiển khác mà ai đó có thể khuyên dùng? Nó sẽ cần có thể vận hành nó trực tiếp từ một tế bào đồng xu nhẹ hoặc pin nhẹ tương tự. (Tôi cũng không chắc chắn làm thế nào để tìm thấy pin 3,3V nhẹ cho arduino pro mini. Tôi đoán chúng tồn tại nhưng tôi chỉ có thể tìm thấy pin 3V cho đến nay). Nếu nó có bộ nhớ trên bo mạch để tiết kiệm nhiệt độ cứ sau vài giờ thì có thể tải xuống sau đó sẽ rất lý tưởng (tôi cũng sẽ quan tâm nếu có ai có đề xuất về bộ nhớ). Tôi biết có thể mua "Ibutton"


... xin lỗi, câu hỏi thực tế của tôi là: Ai đó có thể giới thiệu một bộ vi điều khiển nhẹ có công suất thấp phù hợp hay bạn nghĩ tôi nên tiếp tục với arduino và thử điều chỉnh nó? Bất kỳ trợ giúp được thực sự đánh giá cao!
shara

Bạn có thể sử dụng ATmega328 ở tốc độ 8 MHz, được cung cấp hai pin 1,5V nối tiếp. Sau đó bạn có thể tiếp tục sử dụng thư viện Arduino và IDE.
jfpoilpret

@jfpoilpret, tôi nghĩ 2AA sẽ quá nặng. Một tế bào đồng xu 2032 3V có thể tốt hơn.
Đạt Hà

2
Tùy thuộc vào cách bạn lập trình nó, ATmega328 hoặc ATtiny84 hoặc 85 có thể có mức tiêu thụ rất nhẹ và hoạt động với một tế bào lithium CR2032 trong một thời gian khá lâu. Tuy nhiên, việc giảm mức tiêu thụ năng lượng của một mạch điện (ATmel hoặc bất kỳ loại nào khác) có thể trở nên khá khó khăn.
jfpoilpret

Câu trả lời:


15

Tôi tạo ra một bộ định vị đèn pin nhỏ sử dụng ATtiny85 được cấp nguồn từ một tế bào nút (CR2032). Nó trông như thế này:

Đèn định vị

Mặt khác:

Mặt khác

Mà hiện tại nặng 5,9g. Giá đỡ pin nặng 1,6g để bạn có thể tiết kiệm bằng cách tạo ra giá đỡ nhẹ hơn (có thể là một chút nhựa để cách điện và hàn trực tiếp vào pin). Ổ cắm chip nặng ít nhất 0,5g, vì vậy bạn cũng có thể lưu nó bằng cách hàn vào các chân của bộ xử lý. Vì vậy, chúng tôi xuống đến 3,8g.

ATtiny85 có 512 byte EEPROM mà bạn có thể sử dụng để ghi nhật ký đọc. Tôi không chắc chắn về đồng hồ nếu bạn đang cố gắng tiết kiệm trọng lượng, nhưng nếu bạn khởi động nó vào một thời điểm đã biết, bạn có thể ước tính thời gian hợp lý bằng cách sử dụng millis()chức năng để tìm miliis giây kể từ khi khởi động.

Tôi đã làm một cái khác một lúc trước, đèn flash cứ sau vài giây:

Đèn LED

Điều đó cũng tương tự. Bộ xử lý ở đó (lộn ngược dưới ổ cắm chip) và pin bên dưới. Mà nặng 6g. Pin đã kéo dài một vài năm và đèn flash cứ sau vài giây!

Thay vì đèn LED, bạn có thể có một nhiệt điện trở để đọc nhiệt độ.

Bạn có thể lập trình để đọc một vài giờ và lưu nó vào EEPROM. Sau đó, khi được hướng dẫn (ví dụ: bằng cách nối một vài chân), nó có thể xuất các số đọc sang một chân khác (thông qua nối tiếp).

Bạn có thể tiết kiệm trọng lượng hơn bằng cách sử dụng các thiết bị SMD (gắn trên bề mặt) và có thể sử dụng bảng mạch nhỏ mà bạn có thể tạo nên.


Mã cho định vị ngọn đuốc của tôi là dưới đây. Điều đáng quan tâm là thực tế là nó ngủ hầu hết thời gian. Nó cũng ngủ trong quá trình lấy mẫu ADC. Mặc dù trong trường hợp của tôi, tôi đang đo LDR (điện trở phụ thuộc ánh sáng), mã để đo điện trở nhiệt sẽ tương tự. Bạn chỉ cần thực hiện một số tính toán ở cuối để biến việc đọc thành nhiệt độ.

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

đối với "điều" đèn flash nhấp nháy của bạn, sẽ tốt hơn nếu sử dụng chip hẹn giờ 555? Tôi thấy việc sử dụng ATtiny có phần lãng phí.
Đạt Hà

2
Tôi đã tiêu thụ điện năng thấp. Bộ xử lý ngủ hầu hết thời gian và sau đó nháy đèn LED trong một phần nghìn giây hoặc lâu hơn.
Nick Gammon

cảm ơn! Có vẻ như có thể sử dụng cái này, sẽ phải học cách thiết lập và lập trình nó.
shara

Thay thế đèn LED Thay vì đèn LED, bạn có thể có một nhiệt điện trở để đọc nhiệt độ, thay vào đó, người ta có thể đọc kênh ADC 15, cảm biến nhiệt độ trên tàu. [Tuy nhiên, nó không nhạy cảm hay chính xác.]
James Waldby - jwpat7

Công cụ tìm ngọn đuốc của bạn là một thiết kế tuyệt vời và ước tính tiêu thụ năng lượng bạn đã làm rất nhiều theo tinh thần của "kỹ sư nhiều như bạn cần" tinh thần của Ardunio. Toàn bộ điều làm ấm trái tim của tôi (bất cứ nơi nào có).
cjs

8

Tôi sẽ đề nghị một ATtiny 45/85. Nó là khá nhiều một AVR nhỏ với 5 GPIO. Bạn có thể lập trình nó với Arduino IDE và sử dụng Arduino làm ISP. Nếu bạn có thể thiết kế bạn sở hữu PCB tùy chỉnh, phiên bản ATtiny của SM là nhỏ, thấp và nhỏ gọn. Tổng số mạch để thực hiện chức năng ATtiny cũng là tối thiểu.

nhập mô tả hình ảnh ở đây

Ngoài ra, ở tốc độ xung nhịp thấp (0-4 MHz), bạn có thể cấp nguồn cho ATtiny ở điện áp thấp tới 1,8V. Bạn thậm chí có thể chạy nó ở 1,5V, nhưng điều này không hoàn toàn được khuyến khích. Nếu bạn muốn an toàn, một tế bào đồng xu 3V sẽ nhỏ, phẳng và nó có thể tồn tại trong nhiều năm. Nó cũng an toàn hơn một chút so với lipos có nhiều rủi ro, đặc biệt là nếu bạn gắn nó lên một con vật mà bạn không thể thực sự kiểm soát.

nhập mô tả hình ảnh ở đây

Tôi cũng muốn giới thiệu các thành phần SMD nếu có thể. Nó cho phép tất cả các thành phần thấp hơn và nó không làm tổn thương hoặc sratch da của người / động vật bạn đang theo dõi.


Hình như cả hai chúng tôi đều có cùng một ý tưởng!
Nick Gammon

cảm ơn!! Điều này có vẻ tuyệt vời, thực sự đánh giá cao sự giúp đỡ! Tôi sẽ cố gắng tìm hiểu những điều cơ bản về cách thiết lập vi điều khiển, v.v. từ mạch đầu tiên và một khi tôi làm việc, nó có thể sẽ thay đổi thành các thành phần SMD như bạn đề xuất. Tôi nghĩ thực tế tôi sẽ cần phải làm điều đó để làm cho nó đủ nhỏ.
shara
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.