메모리가있는 초경량 저전력 마이크로 컨트롤러?


9

arduino를 사용하여 몇 가지 프로젝트를 빌드했습니다. 새로운 프로젝트의 경우 피부 표면 온도와 시간 (아마 하루에 몇 번)을 기록하고 전압과 같은 정보를 쉽게 얻을 수 있습니다.

가능한 한 작고 가벼운 (작은 포유류에서 피부 온도를 측정하기 때문에) 가능한 한 5g 미만, 가급적 가벼우 며 배터리를 포함하여 이상적으로는 3g으로 만들어야합니다. 100g의 동물이 너무 많습니다.

전압 조정기를 제거하여 더 적은 전류를 사용하도록 arduino pro mini를 변경하는 것이 가능할 수 있습니까? 그러나 완전히 바꾸고 누군가가 추천 할 수있는 다른 유형의 마이크로 컨트롤러를 프로그래밍하는 법을 배우는 것이 더 합리적일까요? 경량 코인 셀 또는 이와 유사한 경량 배터리에서 직접 작동 할 수 있어야합니다. (또한 arduino pro mini 용 경량 3.3V 배터리를 찾는 방법을 잘 모르겠습니다. 존재하지만 지금까지 3V 배터리 만 찾을 수 있습니다). 나중에 다운로드 할 수있는 온도를 저장하기 위해 온보드 메모리가있는 경우 이상적입니다 (메모리에 대한 권장 사항이있는 사람도 관심이 있습니다). "Ibutton"을 구입할 수 있다는 것을 알고 있습니다


... 죄송합니다, 실제 질문은 : 누군가 저전력의 경량 형 마이크로 컨트롤러를 추천 할 수 있습니까, 아니면 arduino를 계속 사용하여 적응시켜야한다고 생각하십니까? 어떤 도움이라도 정말로 감사합니다!
SH

2 개의 1.5V 배터리를 직렬로 사용하여 8MHz에서 ATmega328을 사용할 수 있습니다. 그런 다음 Arduino 라이브러리와 IDE를 계속 사용할 수 있습니다.
jfpoilpret

@ jfpoilpret, 2AA 너무 무거울 것 같아요. 2032 3V 코인 셀이 더 좋습니다.
Dat Ha

2
프로그래밍 방법에 따라 ATmega328 또는 ATtiny84 또는 85는 매우 가벼운 전류 소비량을 가지며 리튬 CR2032 셀과 꽤 오랫동안 작동 할 수 있습니다. 그러나 회로 (ATmel 또는 기타)의 전력 소비를 줄이는 것은 다소 까다로울 수 있습니다.
jfpoilpret

답변:


15

버튼 셀 (CR2032)로 구동되는 ATtiny85를 사용한 작은 토치 로케이터 를 구성했습니다 . 다음과 같이 보입니다 :

토치 로케이터

다른 쪽:

다른 쪽

현재 무게는 5.9g입니다. 배터리 홀더의 무게는 1.6g이므로 더 가벼운 홀더 (아마도 절연 용 플라스틱 조각을 만들고 배터리에 직접 납땜)를 사용하여 절약 할 수 있습니다. 칩 소켓의 무게는 최소 0.5g이므로 프로세서 핀에 납땜하면 칩 소켓을 절약 할 수 있습니다. 그래서 우리는 3.8g으로 떨어졌습니다.

ATtiny85는 512 바이트의 EEPROM을 가지고 있으며,이를 통해 기록을 기록 할 수 있습니다. 체중을 줄이려고하면 시계에 대해 잘 모르겠지만 알려진 시간에 시작하면 시작 millis()이후 밀리 초를 찾는 기능을 사용하여 합리적인 시간을 추정 할 수 있습니다 .

나는 몇 초 전에 또 다른 것을 만들었습니다 .2 초마다 LED가 깜박입니다.

LED 자동 점멸 장치

비슷합니다. 프로세서는 칩 소켓 아래에 거꾸로 있고 배터리는 아래에 있습니다. 무게는 6g입니다. 배터리는 몇 년 동안 지속되었으며 몇 초마다 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
나는 저전력 소비를하려고했다. 프로세서는 대부분 휴면 상태를 유지 한 다음 1 밀리 초 정도 동안 LED를 깜박입니다.
Nick Gammon

감사! 이것을 사용하는 것이 가능해 보이고 설정하고 프로그래밍하는 법을 배우게됩니다.
SH

“LED 대신 온도를 읽을 수있는 서미스터를 가질 수 있습니다.”대신 온보드 온도 센서 인 ADC 채널 15를 읽을 수 있습니다. [그러나 그것은 매우 민감하거나 정확하지 않습니다.]
James Waldby-jwpat7

당신의 토치 파인더는 훌륭한 디자인의 조각이며 당신이 한 전력 소비량 추정은 Ardunio의 "필요한만큼의 엔지니어"의 정신에 있습니다. 모든 것이 내 마음의 코클을 따뜻하게했다.
cjs

8

나는 ATtiny 45/85를 개인적으로 제안 할 것입니다. GPIO가 5 개인 작은 AVR입니다. Arduino IDE로 프로그래밍하고 Arduino를 ISP로 사용할 수 있습니다. 맞춤형 PCB를 직접 설계 할 수있는 경우 ATtiny의 SMD 버전은 작고 낮으며 소형입니다. ATtiny 기능을 수행하기위한 전체 회로 또한 최소입니다.

여기에 이미지 설명을 입력하십시오

또한 낮은 클럭 속도 (0-4MHz)에서 1.8V의 낮은 전압으로 ATtiny에 전원을 공급할 수 있습니다. 1.5V에서도 작동 할 수 있지만 완전히 권장되는 것은 아닙니다. 안전을 원한다면 3V 코인 셀은 작고 평평하며 수년 동안 지속될 수 있습니다. 또한 위험이 많은 지방 제거술에 비해 조금 더 안전합니다. 특히 실제로 통제 할 수없는 동물에 붙일 경우 더욱 위험합니다.

여기에 이미지 설명을 입력하십시오

가능한 경우 SMD 구성 요소를 권장합니다. 모든 구성 요소를 낮추고 모니터링하는 사람 / 동물의 피부를 다치거나 긁지 않습니다.


우리 둘 다 같은 생각을 한 것 같습니다!
Nick Gammon

감사!! 이것은 멋져 보인다, 정말로 도움을 주셔서 감사합니다! 첫 번째 회로에서 마이크로 컨트롤러 등을 설정하는 방법의 기본 사항을 배우려고 노력하고 일단 작동하면 제안한대로 SMD 구성 요소로 변경 될 수 있습니다. 나는 현실적으로 그것을 작게 만들기 위해 그렇게해야한다고 생각합니다.
SH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.