Питание от пина Arduino Pro Mini

Клапауций
Offline
Зарегистрирован: 10.02.2013

Wadamir пишет:

Клапауций пишет:

от двух пинов питай - через диоды, естественно.

Это, видимо, тонкий английский humor?

не - юмором является ваша тема, а я дело предлагаю - наращивайте количество пинов, пока не добъётесь стабильного результата, а потом посмеётесь и поставите транзисторный ключ на управление питанием отпина.

Wadamir
Offline
Зарегистрирован: 03.12.2013

leshak пишет:

Нет, на самом деле как один из вариантов снизить риски. Но это, опять-таки когда точно знаем сколько модуль жрет в пике (а вы этого не знаете. тестером это не промеряешь). 

Только нужно что-бы оба пина были на одном порту и включать их не через digitalWrite, а через прямую запись в регистры. Что-бы они включались/выключались действительно синхронно. Иначе выпалите их еще быстрее и вернее. И даже помощь модуля для этого не потребуется.

P.S. Но все равно, питатся от пинов - зло.

Вот ведь... Век живи - век учись... Теперь буду знать. Запись в регистры - это я так понимаю из области asm? Последний раз на нем пытался что сделать году так в 96-м и, надо заметить, далеко я тогда не ушел :) Теперь буду стараться лучше!

Wadamir
Offline
Зарегистрирован: 03.12.2013

Клапауций пишет:

Wadamir пишет:

Клапауций пишет:

от двух пинов питай - через диоды, естественно.

Это, видимо, тонкий английский humor?

не - юмором является ваша тема, а я дело предлагаю - наращивайте количество пинов, пока не добъётесь стабильного результата, а потом посмеётесь и поставите транзисторный ключ на управление питанием отпина.

Я уже понял... Приношу извинения за неуместный сарказм...

leshak
Offline
Зарегистрирован: 29.09.2011

Клапауций пишет:

не - юмором является ваша тема, а я дело предлагаю - наращивайте количество пинов, пока не добъётесь стабильного результата, а потом посмеётесь и поставите транзисторный ключ на управление питанием отпина.

Ну вообще-то вроде заработало уже .

А советовать такое новичкам ну мягко говоря.... лучше не нужно.

Вы уверены, что новичок обратит внимание на то что вы использовали "диоды" во множественном числе? Что понял их предназначение "избежать корочения пинов между собой", а не "для сброса 5v до 3v" (раньше-то для этого диод использовал). Или не решит, что "у меня уже есть стабилизатор, заведу на его IN питание с двух пинов". И что потом? Имеем два порта на выход. На один подали digitalWrite(HIGH), какое-то время, пока успеем сделать digitalWrite(HIGH) на второй пин, да пройдет в любом случае. И все это время у нас будет тупо два закороченных пина на одном HIGH, на другом LOW.

Можно конечно сказать, потом, что невнимательно прочитали то что вы советовали. Только зачем же провоцировать потенциально опасное.

 

Клапауций
Offline
Зарегистрирован: 10.02.2013

Wadamir пишет:

Вот ведь... Век живи - век учись... Теперь буду знать. Запись в регистры - это я так понимаю из области asm? Последний раз на нем пытался что сделать году так в 96-м и, надо заметить, далеко я тогда не ушел :) Теперь буду стараться лучше!

не нужно этим заморачиваться - резисторы токоограничительные ставьте да и всё.

leshak
Offline
Зарегистрирован: 29.09.2011

Wadamir пишет:

 век учись... Теперь буду знать. Запись в регистры - это я так понимаю из области asm? 

Не так страшно :)  В разделе програмирование описано.

Прямое управления выходами через регистры микроконтроллера Atmega

Клапауций
Offline
Зарегистрирован: 10.02.2013

leshak пишет:

Вы уверены, что новичок обратит внимание на то что вы использовали "диоды" во множественном числе?

лешак, а вы уверены хоть в чём то?

не смешите меня - если решили снова доебаться, то так и спросите "почему в шапке?".

чел не может понять как транзисторный ключ подключить - как я ему могу дать понять, что "диоды" - это больше одного диода?

как я могу челу объяснить, что всю халабуду нужно токоограничивать?

может человек таблицы умножения не знает - а, я тут странное советую.

Wadamir
Offline
Зарегистрирован: 03.12.2013

Клапауций пишет:

может человек таблицы умножения не знает - а, я тут странное советую.

А где можно почитать про эту таблицу? :)

Клапауций
Offline
Зарегистрирован: 10.02.2013

Wadamir пишет:

А где можно почитать про эту таблицу? :)

у меня в школьных тетрадках на задней обложке была напечатана - не сохранилось древнее знание, к сожалению. :D

Wadamir
Offline
Зарегистрирован: 03.12.2013

Клапауций пишет:

у меня в школьных тетрадках на задней обложке была напечатана - не сохранилось древнее знание, к сожалению. :D

Мы только на бересте писали... Потому, видать, и не довелось мне познать сей труд...

com
Offline
Зарегистрирован: 06.09.2013

Клапауций пишет:

свободу питанию отпина!

а кто такой отпин?

leshak
Offline
Зарегистрирован: 29.09.2011

com пишет:

Клапауций пишет:

свободу питанию отпина!

а кто такой отпин?

Как кто? Тот кого отпинали.

ales2k
Offline
Зарегистрирован: 25.02.2013

Я вчера смотрел заказ оптовый на чипы nrf24l01+ Лучшее что нашел от 4000 шт. по 1.8$ А китайцы продают модули на них за 32 рубля - наводит на мысли. Правда сам использовал штук 20 китайских модулей и все сразу работали и работают до сих пор.

Wadamir
Offline
Зарегистрирован: 03.12.2013

Опять не работает...

Точнее работает, но не так как я хотел :(

Это питание от пина задумывалось с целью отрубать пин на время сна. Что имею сейчас: 

void setup(){
 
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  delay (50);
  ...

Это работает - пинги летят... Жрет в районе 45мА.

Переношу часть сюда:

void loop(){
  
  digitalWrite(5, HIGH);
  delay (50);
 ...

Не работает... Жрет в районе 28мА.

Тоже самое со светодиодом - работает... Такой вредный этот nrf24l01+

ales2k
Offline
Зарегистрирован: 25.02.2013

После включения питания полную инициализацию делаете? После нее надо еще подождать 20 мс.

Также важна последовательность операндов при инициализации. Смотрите как в примере.

Wadamir
Offline
Зарегистрирован: 03.12.2013

ales2k пишет:

После включения питания полную инициализацию делаете? После нее надо еще подождать 20 мс.

Также важна последовательность операндов при инициализации. Смотрите как в примере.

так... с этого места поподробнее... 

вот код:

/**
 * An Mirf example which copies back the data it recives.
 *
 * Pins:
 * Hardware SPI:
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 *
 * Configurable:
 * CE -> 8
 * CSN -> 7
 *
 */

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LowPower.h>

void setup(){
  Serial.begin(9600);
  
  pinMode(5, OUTPUT);

  Mirf.spi = &MirfHardwareSpi;
   
  Mirf.init();
  
  Mirf.setRADDR((byte *)"serv1");
  
  Mirf.payload = sizeof(unsigned long);

  Mirf.config();
  
  Serial.println("Listening..."); 
  
}

void loop(){
  
  digitalWrite(5, HIGH);
  delay (50);
   
  byte data[Mirf.payload];
  
   
  if(!Mirf.isSending() && Mirf.dataReady()){
     
    Mirf.getData(data);
     
    Mirf.setTADDR((byte *)"clie1");
    
    Mirf.send(data);
    
  }
  
}

Это что же, мне весь setup надо в loop перенести? 

ales2k
Offline
Зарегистрирован: 25.02.2013

Ну не весь а только то что настраивает работу модуля. При отключения питания все настройки скидываются. еще не плохо было бы проверку добавить "а включался ли модуль?"

leshak
Offline
Зарегистрирован: 29.09.2011

Wadamir пишет:

Это что же, мне весь setup надо в loop перенести? 

Ну как-бы да... Только не все, а то что отностися к инициализации модуля. И можно не переносить в loop(), а "вынести в отдельную функцию" и вызвать ее из loop(). Когда нужно. Только еще одно... включать питание нужно когда оно выключено.  А то сейчас ваши действия выглядят так:

1. Пытаемся настроить ОБЕСТОЧЕННЫЙ модуль (естественно это "крик в пустоту").
2. Подаем питание на НЕ НАСТРОЕННЫЙ МОДУЛЬ и пытаем что-то отослать (естественно без результатно, так как модуль сконфигугурирвон.
3. Повторяем пункт (2) до потери пульса.

Так как нигде питание не выключается, то логично что и снижения потребления вы не наблюдаете.

А еще, учитывая все вышесказанное, у меня закрались сомнения, что 

>В библиотеке mirf есть режим powerdown, но кушать продолжает... 

Покажите как вы пытались использовать этот режим powerdown. Возможно все эти "тразисторы", "обесточивания и т.п." - мы не ищем легкий путей ;)

Wadamir
Offline
Зарегистрирован: 03.12.2013

Вывел инициализацию в отдельную функцию, поставил delay, воткнул Mirf.powerDown(), вот код:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LowPower.h>

void setup(){
  
  pinMode(5, OUTPUT);
  
  Serial.begin(9600);
  
  Serial.println("Listening..."); 
  
}

void newinit(){
  
  Mirf.spi = &MirfHardwareSpi;
   
  Mirf.init();
  
  Mirf.setRADDR((byte *)"serv1");
  
  Mirf.payload = sizeof(unsigned long);
  
  Mirf.config();
  
  delay(200);
}

void loop(){
  
  digitalWrite(5, HIGH);
  delay (500);

  newinit();
   
  byte data[Mirf.payload];
     
  if(!Mirf.isSending() && Mirf.dataReady()){
     
    Mirf.getData(data);
      
    Mirf.setTADDR((byte *)"clie1");
     
    Mirf.send(data);
    
    Mirf.powerDown();

  }
  
  digitalWrite(5, LOW);
  delay (500);
  
}

И... Не работает... Потребление скачет от 21мА до 41мА.

Wadamir
Offline
Зарегистрирован: 03.12.2013

Работает вот так:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LowPower.h>

void setup(){
  
  pinMode(5, OUTPUT);
  
   digitalWrite(5, HIGH);
  delay (500);
  
  Serial.begin(9600);
  
  Serial.println("Listening..."); 
  
}

void newinit(){
  
  Mirf.spi = &MirfHardwareSpi;
   
  Mirf.init();
  
  Mirf.setRADDR((byte *)"serv1");
  
  Mirf.payload = sizeof(unsigned long);
  
  Mirf.config();
  
  delay(200);
}

void loop(){

  newinit();
   
  byte data[Mirf.payload];
     
  if(!Mirf.isSending() && Mirf.dataReady()){
     
    Mirf.getData(data);
      
    Mirf.setTADDR((byte *)"clie1");
     
    Mirf.send(data);

  }
  
}

Попытка вставить Mirf.powerDown() приводит к тому что пинги перестают работать... 

И еще странные пинги: сначала 11-12 следующий 193-194, затем  опять 11-12 следующий 193-194

leshak
Offline
Зарегистрирован: 29.09.2011

Не, ну тут нужно или крестик снять или трусы надеть ;)

Что-же вы сразу и внешние питание дергаете и встроенный powerDown мучаете. Намешали все в одну тарелку.

Пошагово идите.... разбивайте задачу. Вначале убедитесь что модуль действительно засыпает по powerDown (как "разбудить" - потом отдельно будете разбиратся).

Запитайте его, через регулятор, от VCC. И амперметр воткните между регулятором и модулем. Что-бы мерять потребление именно модуля.

Потом возьмите оригинальный пример библиотеки. И в начало (или конец - не важно), loop() добавте что-то такое:

if(millis()>10000){ // через 10-ть секунд от включения
  Mirf.powerDown(); // выключаем модуль
  while(true){}; // и уходим в бесконечный цикл. больше ничего и никогда делать не будем
}

И смотрите на амперметр. Первый 10-ть секунд - смотрите сколько модуль потребляет в активном состоянии, все остальное время - сколько он потребляет в режиме сна.

Клапауций
Offline
Зарегистрирован: 10.02.2013

com пишет:

а кто такой отпин?

да, так - решил закрепить в массах новый анархо-технический мем.

Клапауций
Offline
Зарегистрирован: 10.02.2013

leshak пишет:

Как кто? Тот кого отпинали.

о! ну, расскажи мне, кто кого отпинал. страницы на две воспитательну поэму в прозе мне выдай, пожалуйста.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

leshak пишет:

Имеем два порта на выход. На один подали digitalWrite(HIGH), какое-то время, пока успеем сделать digitalWrite(HIGH) на второй пин, да пройдет в любом случае. И все это время у нас будет тупо два закороченных пина на одном HIGH, на другом LOW.

Можно конечно сказать, потом, что невнимательно прочитали то что вы советовали. Только зачем же провоцировать потенциально опасное.

Уточняем.....

1. Имеем два порта на вход. ( дефолт при подаче питания)

2. Пишем   digitalWrite(Port1 , HIGH); digitalWrite(Port2, HIGH);

   Включились резисторы привязки к питанию.

3. Пишем pinMode(Port1 , OUTPUT);

Port1 переключился на выход и подал питание(HIGH).

В это время Port2 ОСТАЛСЯ ВХОДОМ  с привязкой... да и чёрт с ним....

4. Пишем pinMode(Port2 , OUTPUT); Port2  стал выходом и тоже подал питание.

А где коза? Нету!

То есть диоды особенно то и не нужны.

И вообще я теперь привык только в таком порядке:

digitalWrite(Port1 , HIGH);

pinMode(Port1 , OUTPUT);

А не наоборот...

void PowerON(){

   digitalWrite(Port1 , HIGH); 
   digitalWrite(Port2 , HIGH);

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);
}

void PowerOFF(){

   pinMode(Port1 , INPUT);
   pinMode(Port2 , INPUT);

   digitalWrite(Port1 , LOW); 
   digitalWrite(Port2 , LOW); 

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

trembo пишет:

В это время Port2 ОСТАЛСЯ ВХОДОМ  с привязкой... да и чёрт с ним....

4. Пишем pinMode(Port2 , OUTPUT); Port2  стал выходом и тоже подал питание.

А где коза? Нету! То есть диоды особенно то и не нужны.

Дефолтовое состояние OUTPUT  -LOW, козочка неизбежна)

leshak
Offline
Зарегистрирован: 29.09.2011

trembo пишет:

А где коза? Нету!

Способов избежать КЗ может быть несколько. Вопрос состоял в том, нужно ли такие потенциально опасные решения предлагать новичку (который с ненулевой вероятностью даже прямые инструкции может выполнить с ошибкой). Предлагать даже без предупреждение ВНИМАНИЕ... и описанием что может случится. Вообщем тут скорее вопрос в отношении к тезису "не навреди". Кто-то старается его предерживатся, а кто-то считает "все взрослые люди, пусть каждый сам думает что делает". Доля истины есть и в одном и втором подходе. Кто-то ребенка старается уберечь от любых опастностей, а кто-то считает что "небольшая травма" - не страшна. Пусть лучше один раз обожжется и поплачет, чем 100 раз словами объяснять что это больно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

dimax пишет:

Дефолтовое состояние OUTPUT  -LOW, козочка неизбежна)

Прочтите внимательно пункт 2.

http://arduino.ru/forum/apparatnye-voprosy/pitanie-ot-pina-arduino-pro-mini?page=1#comment-61938

Сходите в даташит или на первоисточник. http://arduino.cc/en/Tutorial/DigitalPins

Найдите следующий текст:

The pullup resistors are controlled by the same registers (internal chip memory locations) that control whether a pin is HIGH or LOW.

Consequently, a pin that is configured to have pullup resistors turned on when the pin is an INPUT, will have the pin configured as HIGH if the pin is then switched to an OUTPUT with pinMode().

This works in the other direction as well, and an output pin that is left in a HIGH state will have the pullup resistors set if switched to an input with pinMode().

 http://translate.google.com/#en/ru/The%20pullup%20resistors%20are%20controlled%20by%20the%20same%20registers%20%28internal%20chip%20memory%20locations%29%20that%20control%20whether%20a%20pin%20is%20HIGH%20or%20LOW.%20Consequently%2C%20a%20pin%20that%20is%20configured%20to%20have%20pullup%20resistors%20turned%20on%20when%20the%20pin%20is%20an%20INPUT%2C%20will%20have%20the%20pin%20configured%20as%20HIGH%20if%20the%20pin%20is%20then%20switched%20to%20an%20OUTPUT%20with%20pinMode%28%29.%20This%20works%20in%20the%20other%20direction%20as%20well%2C%20and%20an%20output%20pin%20that%20is%20left%20in%20a%20HIGH%20state%20will%20have%20the%20pullup%20resistors%20set%20if%20switched%20to%20an%20input%20with%20pinMode%28%29.

 
leshak
Offline
Зарегистрирован: 29.09.2011

trembo пишет:

А не наоборот...

void PowerON(){

   digitalWrite(Port1 , HIGH); 
   digitalWrite(Port2 , HIGH);

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);
}

void PowerOFF(){

   pinMode(Port1 , INPUT);
   pinMode(Port2 , INPUT);

   digitalWrite(Port1 , LOW); 
   digitalWrite(Port2 , LOW); 

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);

}

 

Вот, я же говорил "стремно". Ходьба по лезвию. Вот и вы промахнулись и попали на КЗ.

Что будет если вызвать poweOn(), ПОСЛЕ powerOff()?  Порты включены "на выход", а вы им digitalWrite.... Вернулись к тому с чего начинали. Можно конечно, и в powerOn() делать pinMode(INPUT). Да только.... КЗ-то мы уже получили ;)

Не надолго:

Но все-таки получили. Может и выживет пин за эти три микросекунды. Но вот если мы пиханцли эти powerUp,powerDown в loop(), то эти микросекунды у нас начнут складываться. Мы получим КЗ-ШИМ :) И тут шансы умереть у пина (или камня, или USB) - уже гораздо выше. По крайней мере, я не хочу на своей дуинке пробовать и реально их коротить ;)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

trembo, не знал про наследование состояний. Вы мануал наузусть что ли учили ? :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

TO: leshak

Да, заметили всё-таки, недосмотр вышел, ошибку исправил:

void PowerON(){

   pinMode(Port1 , INPUT);
   pinMode(Port2 , INPUT);

   digitalWrite(Port1 , HIGH); 
   digitalWrite(Port2 , HIGH);

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);
}

void PowerOFF(){

   pinMode(Port1 , INPUT);
   pinMode(Port2 , INPUT);

   digitalWrite(Port1 , LOW); 
   digitalWrite(Port2 , LOW); 

   pinMode(Port1 , OUTPUT);
   pinMode(Port2 , OUTPUT);

}

 Козы не будет!

 
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

dimax пишет:

trembo, не знал про наследование состояний. Вы мануал наузусть что ли учили ? :)

Просто там один регистр (PORTx - Port X Data Register)включает резисторы и выдаёт LOW-HIGH

в зависимости от режима пина (DDRx - Port X Data Direction Register)

leshak
Offline
Зарегистрирован: 29.09.2011

dimax пишет:

trembo, не знал про наследование состояний. Вы мануал наузусть что ли учили ? :)

Я к примеру просто полез в исходник pinMode что-бы для себя это прояснить :)  OpenSource же ;)

void pinMode(uint8_t pin, uint8_t mode)
{
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *reg;

	if (port == NOT_A_PIN) return;

	// JWS: can I let the optimizer do this?
	reg = portModeRegister(port);

	if (mode == INPUT) { 
		uint8_t oldSREG = SREG;
                cli();
		*reg &= ~bit;
		SREG = oldSREG;
	} else {
		uint8_t oldSREG = SREG;
                cli();
		*reg |= bit;
		SREG = oldSREG;
	}
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

trembo пишет:

TO: leshak

Да, заметили всё-таки, недосмотр вышел, ошибку исправил:

А камень-то уже тю-тю... (тьфу, тьфу). Да еще удаленно, у новичка. Которые еще и не сразу поймет что писец уже пробежался....

Так что "ну его нафиг". Все ошибаются, в том числе и опытные (я сам бы так запросто мог ошибится). Поэтому чем дальше от "края" тем спокойней.

P.S. Я если еще подумать каковы шансы что новичок сообразит вначале digitalWrite, а потом pinMode делать?  Ему-то изначально сказали просто "питайся с двух ног". 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

leshak пишет:

P.S. Я если еще подумать каковы шансы что новичок сообразит вначале digitalWrite, а потом pinMode делать?  Ему-то изначально сказали просто "питайся с двух ног". 

Может быть на таком "грубом" примере поймёт что всё в мире взаимосвязано.

Заодно услышал что есть какие-то регистры.... :)

http://www.avr-tutorials.com/digital/about-avr-8-bit-microcontrollers-di...

leshak
Offline
Зарегистрирован: 29.09.2011

trembo пишет:

Заодно услышал что есть какие-то регистры.... :)

http://www.avr-tutorials.com/digital/about-avr-8-bit-microcontrollers-digital-io-ports

Я выше ссылку давал, на их описание по русски. На этом сайте.Прямое управления выходами через регистры микроконтроллера Atmega

Ну а если хочется "вкиснуть". Понимать что будет с входами когда камень обесточен, а на нее приходят какие-нибудь импульсы, что это за фигня "подтягивающий резистор и т.п." то... AVR. Учебный курс. Устройство и работа портов ввода-вывода | Электроника для всех

Wadamir
Offline
Зарегистрирован: 03.12.2013

leshak пишет:

Не, ну тут нужно или крестик снять или трусы надеть ;)

В основном работаю в трусах, а с крестиком - так и не надевал, религия не позволяет :)

leshak пишет:

Что-же вы сразу и внешние питание дергаете и встроенный powerDown мучаете. Намешали все в одну тарелку.

Пошагово идите.... разбивайте задачу. Вначале убедитесь что модуль действительно засыпает по powerDown (как "разбудить" - потом отдельно будете разбиратся).

Запитайте его, через регулятор, от VCC. И амперметр воткните между регулятором и модулем. Что-бы мерять потребление именно модуля.

Потом возьмите оригинальный пример библиотеки. И в начало (или конец - не важно), loop() добавте что-то такое:

if(millis()>10000){ // через 10-ть секунд от включения
  Mirf.powerDown(); // выключаем модуль
  while(true){}; // и уходим в бесконечный цикл. больше ничего и никогда делать не будем
}

И смотрите на амперметр. Первый 10-ть секунд - смотрите сколько модуль потребляет в активном состоянии, все остальное время - сколько он потребляет в режиме сна.

Сделано! Воткнул на замер беспроводного модуля, вставил код. 

Первые 10 секунд - потребление 30мА; 

После 10 секунд - потребление 10мА. Многовато в-общем для powerDown...

trembo пишет:

Может быть на таком "грубом" примере поймёт что всё в мире взаимосвязано.

Заодно услышал что есть какие-то регистры.... :)

http://www.avr-tutorials.com/digital/about-avr-8-bit-microcontrollers-di...

Не, ну мы тоже не лаптем щи хлебаем...  про регистры-то я слыхал :) Просто внимательно к этому не относился... Простите великодушно ;)

Wadamir
Offline
Зарегистрирован: 03.12.2013

Заработала вот такая махинация:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

long previousMillis = 0; 
long interval = 5000; 
const int SuperPin = 5; 

void setup(){
  Serial.begin(9600);
  
  pinMode(SuperPin, OUTPUT);
  
  /*
   * Set the SPI Driver.
   */
  
  Serial.println("Listening..."); 
}

void newinit(){
  
  Mirf.spi = &MirfHardwareSpi;
  
  /*
   * Setup pins / SPI.
   */
   
  Mirf.init();
  
  /*
   * Configure reciving address.
   */
   
  Mirf.setRADDR((byte *)"serv1");
  
  /*
   * Set the payload length to sizeof(unsigned long) the
   * return type of millis().
   *
   * NB: payload on client and server must be the same.
   */
   
  Mirf.payload = sizeof(unsigned long);
  
  /*
   * Write channel and payload config then power up reciver.
   */
   
  Mirf.config();
  
  delay(500);
  
  byte data[Mirf.payload];
  
  /*
   * If a packet has been recived.
   *
   * isSending also restores listening mode when it 
   * transitions from true to false.
   */
   
  if(!Mirf.isSending() && Mirf.dataReady()){
    Serial.println("Got packet");
    
    /*
     * Get load the packet into the buffer.
     */
     
    Mirf.getData(data);
    
    /*
     * Set the send address.
     */
     
     
    Mirf.setTADDR((byte *)"clie1");
    
    /*
     * Send the data back to the client.
     */
     
    Mirf.send(data);
    
    /*
     * Wait untill sending has finished
     *
     * NB: isSending returns the chip to receving after returning true.
     */
      
    Serial.println("Reply sent.");
  }
  
}

void loop(){
  
  digitalWrite(5, HIGH);
  
  newinit();
  
  unsigned long currentMillis = millis();
  
  /*
   * A buffer to store the data.
   */
   

  
    if (currentMillis - previousMillis > interval) {
      
      digitalWrite(5, LOW);
    
      while(millis() - currentMillis < interval) {
      
        Mirf.powerDown(); // выключаем модуль  
       
      }
      
      previousMillis = currentMillis+interval;
    
    }

}

Теперь 5 секунд потребление беспроводного модуля - 30мА,

следующие 5 секунд потребление - 0мА.

Ткните носом в нефеншуйную часть... Исключая то, что это питание от ноги пина...

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не по феншую  const int SuperPin = 5; и digitalWrite(5, LOW);

А потребление "0" потому-что если 5 (SuperPin) это питание

я бы тоже отказался что-либо потреблять после  digitalWrite(5, LOW);

 

Wadamir
Offline
Зарегистрирован: 03.12.2013

trembo пишет:

Не по феншую  const int SuperPin = 5; и digitalWrite(5, LOW);

А потребление "0" потому-чтоесли 5 (SuperPin) это питание

я бы тоже отказался что-либо потреблять после  digitalWrite(5, LOW);

Тупанул... Не отрицаю... 

БЛАГОДАРЮ ВСЕХ, принимавших участие в моём обучении! Пошел учить регистры и порты...

special thanx to Leshak!

leshak
Offline
Зарегистрирован: 29.09.2011

А в чем смысл делать:

while(millis() - currentMillis < interval) {
        Mirf.powerDown(); // выключаем модуль 
      }

       

Вы рубанули ему питание, а потом многократно, судорожно пытаетесь послать команду "выключись..." Он все равно уже никого и ничего не слышит. Да и смысла в это while() - нет. Получился блокирующий кусок в котором ничего полезного не делается. А значит вполне можно просто заменитье го на

delay(inteval);

 

leshak
Offline
Зарегистрирован: 29.09.2011

leshak пишет:

 Да и смысла в это while() - нет. Получился блокирующий кусок в котором ничего полезного не делается. 

Не, не получается.... вы же знак на меньше поменяли...

Вообщем не понимаю я этого while вообще целиком. Зачем он там нужен, и че вообще от него хотели...

Wadamir
Offline
Зарегистрирован: 03.12.2013

leshak пишет:

Вообщем не понимаю я этого while вообще целиком. Зачем он там нужен, и че вообще от него хотели...

Я сам не совсем понимаю зачем он, но без него не работает :(

Я сейчас изменил loop, теперь он выглядит вот так:

void loop(){
  
  unsigned long currentMillis = millis();
  
  digitalWrite(SuperPin, HIGH);
  
  newinit();
  
  if (currentMillis - previousMillis > interval) {
    
      Mirf.powerDown();
      
      digitalWrite(SuperPin, LOW);    
      
      while(millis() - currentMillis < interval) { }

      previousMillis = currentMillis+interval;
      
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);    
  }
}

Вот еще какая проблема вылезла (надоел уже, наверное): 

Если Mirf.powerDown () убрать - вся система потребляет в спящем режиме около 5мА, если поставить Mirf.powerDown () - система потребляет в спящем режиме около 4мА.

Я так понимаю это кушают пины, которые идут в беспроводной модуль - 7,8 - если их выдернуть - кушает 2,5мА. Так вот - можно их тоже гасить?

Wadamir
Offline
Зарегистрирован: 03.12.2013

Вставил вот это:

      digitalWrite(7, LOW);
      digitalWrite(8, LOW);  

Теперь потребление 2,5мА. Почему не 0,3мА?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

1. Для надёжности:

pinMode ( 7 , INPUT ) ;  

pinMode ( 8 , INPUT ) ;

digitalWrite ( 7 ,  LOW ) ; 

digitalWrite ( 8 ,  LOW )

2. Я думаю если модуль без питания - надо ВСЕ идущие к нему сигналы опустить в LOW:

MOSI , MISO, SCK, CE, CS

ales2k
Offline
Зарегистрирован: 25.02.2013

Потому что у вас фьюзы в проце прошиты не для минимального энергопотребления 5.8 мка во сне

Вот пример - не копируйте его без понимания - там проц на внутреннем генераторе

http://arduino.ru/forum/proekty/bolshie-chasy-pogodnaya-stantsiya#comment-31370

Wadamir
Offline
Зарегистрирован: 03.12.2013

Поменял "Крону" в мультиметре - потребление стало 1,4мА :) Но сломалась одна секция у последней цифры мультиметра :(

Wadamir
Offline
Зарегистрирован: 03.12.2013

ales2k пишет:

Потому что у вас фьюзы в проце прошиты не для минимального энергопотребления 5.8 мка во сне

Вот пример - не копируйте его без понимания - там проц на внутреннем генераторе

http://arduino.ru/forum/proekty/bolshie-chasy-pogodnaya-stantsiya#comment-31370

нет-нет... у меня было потребление 0,3мА без всяких прошиваний...

ales2k
Offline
Зарегистрирован: 25.02.2013

Значит не все отключаете, если используете стабилизатор на постоянку (не на отключаемых пинах) - от тоже кушает.

Wadamir
Offline
Зарегистрирован: 03.12.2013

trembo пишет:

1. Для надёжности:

pinMode ( 7 , INPUT ) ;  

pinMode ( 8 , INPUT ) ;

digitalWrite ( 7 ,  LOW ) ; 

digitalWrite ( 8 ,  LOW )

2. Я думаю если модуль без питания - надо ВСЕ идущие к нему сигналы опустить в LOW:

MOSI , MISO, SCK, CE, CS

СДЕЛАНО! РАБОТАЕТ! потребление 198мкА!!!

вот код:

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#include <LowPower.h>

long previousMillis = 0; 
long interval = 1000; 
const int SuperPin = 5; 

void setup(){
  
  pinMode(SuperPin, OUTPUT);
  
}

void newinit(){
  
  Mirf.spi = &MirfHardwareSpi;

  Mirf.init();
 
  Mirf.setRADDR((byte *)"serv1");
   
  Mirf.payload = sizeof(unsigned long);
  
  Mirf.config();
  
  delay(50);
  
  byte data[Mirf.payload];
   
  if(!Mirf.isSending() && Mirf.dataReady()){    
    Mirf.getData(data);    
    Mirf.setTADDR((byte *)"clie1");     
    Mirf.send(data);
  }
  
}

void loop(){
  
  unsigned long currentMillis = millis();
 
  digitalWrite(SuperPin, HIGH);
  
  newinit();
  
  if (currentMillis - previousMillis > interval) {
    
      powerdown();
      
      while(millis() - currentMillis < interval) { }

      previousMillis = currentMillis+interval;
      
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);    
  }
  
}

void powerdown() {
  
      Mirf.powerDown();
        
      digitalWrite(SuperPin, LOW); 
        
      pinMode(7,INPUT);
      digitalWrite(7, LOW);
      
      pinMode(8,INPUT);
      digitalWrite(8, LOW);
      
      pinMode(11,INPUT);
      digitalWrite(11, LOW);
      
      pinMode(12,INPUT);
      digitalWrite(12, LOW);
      
      pinMode(13,INPUT);
      digitalWrite(13, LOW);
      
}

СПАСИБО!!!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Ну да, это классический случай запитывания цифровой микросхемы от входного сигнала, ещё со времён 155 серии,когда она получала питание от высокого уровня на одном из входов (через защитный диод).

Правда напряжение питания было немного просажено, но этого хватало чтобы успешно работать до той поры пока все входы не уходили в низкий уровень.

Я думаю вам ещё надо померять ток при отключенном модуле. Они должны совпадать.

И ещё, после повердауна модуля перейти на другой генератор тактовой частоты, например на 8/8 внутреннего или даже на генератор ватчдога, но как это сделать не смогу подсказать.

Только осторожно, там со стандартным бутлодером и вачдогом была проблемма.

Я для проверки ставил 8 секунд, чтобы можно  было потом кое-как его отменить.

http://www.fiz-ix.com/2012/11/low-power-arduino-using-the-watchdog-timer/