Нужен совет

Информация из первых уст

Наши авторы

Иван Парфенов

Кирилл Анофриев

Павел Егоров

Анна Киросова

Как восстановить электронную книгу

Есть способ для программного восстановления электронных книг - портативных медиа плееров. Способ работает на книгах фирм Effire, Ritmix, Texet, Teclast и др китайского производства. 
 

Подключение внешнего Wi-Fi адаптера к планшету на андроид 4

#!/system/bin/sh

 

ip link set wlan0 down

iwconfig wlan0 channel auto

iwconfig wlan0 Bit 54Mb/s

iwconfig wlan0 essid 'SSID name'

sleep 10

 

Ускоряем АЦП Arduino DUE

С некоторого времени я являюсь счастливым обладателем платы Arduino DUE на микроконтроллере ARM Cortex-M3 AT91SAM3X8E. На кристалле находится 12-битный АЦП с частотой дискретизации 1 Мs/sec. Для программирования платы имеется удобная среда Arduino IDE 1.5, благодаря которой не требуется больших усилий, чтобы заставить плату работать. 

Для решения одной из моих задач мне нужно было отцифровывать форму фотоотклика от фототранзистора. В железной части все очень просто - фототранзистор одной ногой соединяем с +3.3 Вольта, вторую через резистор 4,7 кОм - с землей. Выход фототранзистора, который с резистором - соединяем с входом платы A2. Фотоприемник готов. Теперь подключаем светодиод через ограничительный резистор к выводу платы 9. Землю светодиода - к земле платы. Ну а также подключить через кабель MicroUSB плату к компьютеру. Стоит еще придумать светозагораживающий экран для всей конструкции, иначе будете ловить свет от всего светящегося.

Логика работы такая: по команде с компьютера включается регистрация на входе канале 2 АЦП. Через кототкое время включается светодиод и через 500 мкс отключается. Затем отключается регистрация и весь пакет данных по кабелю передается на компьютер,  где он выводится на экран.

Код прошивки Arduino DUE:

boolean stringComplete = false;
 
byte inData[1];
const byte sizeStr = 2;
byte inByte = 0;
int counter = 0; 
 
byte outData[999]; 
const int outsizeStr = 1000;
 
// Packet structure
const byte addressByte = 0;
const byte commandByte = 1;
 
const byte address = 0xbb;
 
unsigned int d;
byte dH, dL = 0;
const byte LED = 9;
unsigned long startT;
 
void setup(void) {  
     Serial.begin(115200); 
     pinMode(LED, OUTPUT); 
     digitalWrite(LED, 0); 
     analogReadResolution(12);
     adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX*2, 4);
     }
 
void loop(void) {
  // Serial Read in background       
     parser();  
}
 
void parser(void) { 
    if ((stringComplete) && (inData[addressByte] == address)) {
       switch (inData[commandByte]) {
       case 0x00: ; // Reserved
       break;
       case 0x01: ; // Reserved
       break;
       case 0x02: adc2Send(); // Read adc2 value and send out
       break;      
       } 
    counter = 0; stringComplete = false; 
    }    
}
 
void adc2Send() {
 
 int i = 0; startT = 0;
 while (i<outsizeStr) {
     d = analogRead(A2);
     dH = (byte)((d >> 8) & 0xFF);
     dL = (byte)(d & 0xFF); 
          
     outData[i] = dH;
     i++;
     outData[i] = dL; 
     i++;
     if (i == 100)  {digitalWrite(LED, 1); startT = micros(); }
//     if (i == 600)  {digitalWrite(LED, 0); }
//
     if ((micros() - startT) > 500 )   {digitalWrite(LED, 0);} // after 5 ms turn off
            
 }
     Serial.write(outData,outsizeStr);   
}
 
void serialEvent() {
     while (Serial.available()) {
     inByte = Serial.read(); 
     inData[counter] = inByte; 
     counter++;
     if (counter == sizeStr) {stringComplete = true;}
     }
}
Здесь стоит отметить строчку
adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX*2, 4);
 
Без нее плата будет регистрировать показания во много раз медленнее. Последний параметр - 4 - время старта АЦП, снижать его не стоит, иначе получите "звездное небо".
Да, программа работает с версией Arduino 1.5.2 nightly builds. В более ранних версиях не отработана функция serialEvent.
Версия для ПК имеет такой вид:
На рисунке показан вид фотоотклика от светодиода длительностью 500 мкс. На всем графике уместилось 500 значений. Фоновый уровень идет не от нуля, т.к. у моей конструкции плохое светоэкранирование.
Часть исходников программы выкладываю здесь, полную версию ищите на code.google.com
var
  Form1: TForm1;
  
    Buff: Array [0..1] of byte;      //Sending data array
    BuffRecv: Array [1..1000] of byte;  //Recieving data array
    inVoltage: array [1..1000] of Integer;       // see const section
const
    dataBytes = 500 + 1 ;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.ReadADC;
var
x: Word;
begin
       bcmprt1.ClearBuffer(True,True);
       pntsrsSeries1.Clear;
 
       SendRecvSerial($02);     // Only read ADC
         x:=1;
         while (x < dataBytes) do
         begin
          pntsrsSeries1.AddY( inVoltage[x], '', clRed);  // Plot data
          Application.ProcessMessages;      //Warning
          x:=x+1;
         end;
end;
 
procedure TForm1.SendRecvSerial(outCmd: Byte);
var
x, y : Word;
begin
    Buff[0]:= $BB;
    Buff[1]:= outCmd;
    bcmprt1.Write(Buff, 2);
 
   Delay(200) ;     // delay
 
   bcmprt1.Read(BuffRecv, Length(BuffRecv));
 
   x:= 1; y:= 1;
   while (x < dataBytes) do
   begin
   inVoltage[x]:= BuffRecv[y]*256 + BuffRecv[y+1];
   inVoltage[x]:= inVoltage[x]*3300 div 4095;
   x:=x+1;
   y:=y+2;
   end;
   lblMax.Caption:=IntToStr(MaxIntValue(inVoltage))   ;
 
end;