'본좌급 분류'에 해당되는 글 168건

  1. 2012.04.10 자작 CNC..#2 를 위하여..
  2. 2012.04.03 알릭스 주무르기~~
  3. 2012.03.22 요즘 대세 ALIX 를 만들다.
  4. 2012.03.18 코딩중 .. 2
  5. 2012.03.18 코딩 중..
  6. 2012.03.16 알릭스 보드를 지르다..
  7. 2012.03.08 부스트 컨버터의 제작.
  8. 2012.03.08 NIXIE 소켓용 PCB 제작..
  9. 2012.03.08 nixie
  10. 2012.03.01 간단한 imu 테스트.

자작 CNC..#2 를 위하여..

스케치업 스킬도 늘릴겸. 디자인해보고 있다.





알릭스 주무르기~~

voyageMPD 이거 저거 건드려보고 있습니다.


잠깐 가지고 노는 중에 삽질 하나를 하고..이에 저같은 사람이 나타나지 않길 바라는 마음에 글을 씁니다.


삼바 등을 자동 마운트하려고 fstab 을 건드는데요.


문제는 voyageMPD 가 처음 부팅되면 읽기 전용으로 부팅된다는 겁니다.


remountrw 를 쳐줘야 쓰는 게 가능해지는데, 이미 fstab 에서 에러가 나기 때문에 remountrw 명령이 먹지 않습니다.


remountrw 에러를 없애기 위해 fstab 을 수정하면 역시 읽기 전용이라 저장이 안됩니다; 악순환에 빠진겁니다.


난감하더군요.


생각끝에.. 일단 CF를 분리하고 다른 리눅스 시스템에 물려서 인식 후, 잘못된 라인을 삭제 후 저장


어쨌든 CF 메모리 포맷안하고 해결했네요. 다행..


제가 지금 해보고 있는 일은 usb 메모리에 음악 담아서 mpd를 이용해 alix 에서 재생해보는 겁니다.


alix 용 커널은 최적화가 잘되서 자동으로 되는게 하나도 없네요;;


삽질해서 얻은 정보를 잠깐 공유해봅니다.


usb 메모리 꽂고 


# fdisk -l 


하면 usb 메모리의 device 이름이 나옵니다.


저같은 경우는 sda1 이군요. 어쨌든 이를 기억했다가..


윈도우에서 담은 usb 메모리가 자동 마운트되도록 하려면 fstab 에 다음과 같이 추가해줍니다.


참고로 윈도우에서 포맷한 경우 FAT32 형식을 갖게 되고 이에 해당하는게 vfat 입니다.


그리고, 한글입출력이 문제인데, iocharset=utf8 로 하면, putty 상에서는 깨져보여도 mpad 등에서는 제대로 나옵니다.


어쨌든..


# vi /etc/fstab

(여기부턴 vi 를 좀 쓰실 줄 알아야 합니다. 아니면 다른 리눅스용 편집툴이라도..)

.....

/dev/sda1 /media/usb0 vfat defaults,iocharset=utf8 0 0


추가하셔서 저장하시고 


# mount -a


명령 후에..


# df

...

/dev/sda1           ........       /media/usb0

..

이 추가되었는지 확인하시구요.


참고로 저같은 경우엔 습관적으로 /mnt/.. 에 마운트를 했는데, 이렇게 하면 mpd 에서 인식을 못하더군요. (삽질 ㅠ.ㅜ)


어쨌든


# mpc update


# mpc listall


하셔서, usb 메모리에 담겨 있던 음악 파일들이 쭉 뜨는지 확인해보세요.


ps. 어떤 리더기들은 voyageMPD 에서 지원을 잘 안합니다. 예를 들어 아예 인식을 못하거나 Input/output  에러를 내기도 합니다. (무한 삽질..)

요즘 대세 ALIX 를 만들다.



일단 아이패드로 찍어서 화질이 조악합니다.


어떻게 꾸밀까 고민을 했는데 alix + 헤드폰 앰프.. 로 마무리 지었습니다.


원래엔 alix + LM3875 파워앰프 를 할까 계획중이었는데 케이스 사이즈가 미묘하게 작더군요. 방열판도 구해야되고 그래서..일단 헤드폰 앰프를 달아봤습니다.


DAC는 전에 만들어둔 COSDAC 보드입니다.


어쨌든 이길범님 헤드폰 앰프를 여기에다 달아서 일단락했네요. 


그러나 곧 개조를 할 생각입니다. 그 이유를 들자면..


부팅 시간이 생각보다 깁니다. CF 카드를 뭘쓰냐에 따라 단축될 수도 있다고 하는데... 저같은 경우는 3분 정도 걸립니다.


오디오라는게, 전원을 켜자 마자 소리가 나오는 환경에 살아왔기 때문에 이에 영 적응이 안되네요.


alix의 소모 전력이 적기 때문에 항상 켜두는게 좋을 거 같구요.


따라서, 아주 심플하게 alix + 전원 + ADC 만 모듈화 하는게 좋을 듯 하네요. 앰프는 빼는게좋을 듯 합니다.


그리고 내부 5V, 3.3V 전원을 보니 DC-DC 컨버터를 씁니다.


따라서 외부 12V 를 리니어 전원으로 교체하여 쓰는게 큰 의미가 없는 거 같네요.


그래서 SMPS 로 교체했습니다.


5V, 3.3V 모두 리니어로 직접 공급하면 말이 좀 다르겠지만요.


그럼 이만.



코딩중 .. 2



// Made by DAEWOO RYU
// NEW TECHNOLOGY COMPANY(N.T.C)
// Email : davdiryu@newtc.co.kr
// http://www.NTC.co.kr
// You can use this source code freely, but we don't support for upgrading or
// we do have no responsiblilty for using this source code for commercial purpose.
// When you spread this source code out, then please leave my name and company name.

// ****************************** //
// *** I2C Hardware Interface *** //
// ****************************** //

#define F_CPU (16000000L)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <compat/twi.h>



#define MAX_TRIES 50
#define DS1307_ID    0xD0        // I2C DS1307 Device Identifier
#define DS1307_ADDR  0x00        // I2C DS1307 Device Address
#define I2C_START 0
#define I2C_DATA 1
#define I2C_DATA_ACK 2
#define I2C_STOP 3
#define ACK 1
#define NACK 0

// DS1307 Register Address
// Second: ds1307_addr[0]
// Minute: ds1307_addr[1]
// Hour  : ds1307_addr[2]
// Day   : ds1307_addr[3]
// Date  : ds1307_addr[4]
// Month : ds1307_addr[5]
// Year  : ds1307_addr[6]

#define HOUR_24 0
#define HOUR_12 1
char ds1307_addr[7];
char sdigit[3]={'0','0','\0'};
char *weekday[]={"Null","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
char *month[]={"Null","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char hour_mode, ampm_mode;




/* START I2C Routine */
unsigned char i2c_transmit(unsigned char type) 
{
  switch(type) {
     case I2C_START:    // Send Start Condition
       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
       break;
     case I2C_DATA:     // Send Data with No-Acknowledge
       TWCR = (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_DATA_ACK: // Send Data with Acknowledge
       TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_STOP:     // Send Stop Condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return 0;
  }
  // Wait for TWINT flag set on Register TWCR
  while (!(TWCR & (1 << TWINT)));
  // Return TWI Status Register, mask the prescaller bits (TWPS1,TWPS0)
  return (TWSR & 0xF8);
}
char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type)
{
  unsigned char n = 0;
  unsigned char twi_status;
  char r_val = -1;
i2c_retry:
  if (n++ >= MAX_TRIES) return r_val;
  // Transmit Start Condition
  twi_status=i2c_transmit(I2C_START);

  // Check the TWI Status
  if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
  if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
  // Send slave address (SLA_W)
  TWDR = (dev_id & 0xF0) | (dev_addr & 0x07) | rw_type;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
  if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

void i2c_stop(void)
{
  unsigned char twi_status;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_STOP);
}

char i2c_write(char data)
{
  unsigned char twi_status;
  char r_val = -1;
  // Send the Data to I2C Bus
  TWDR = data;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

char i2c_read(char *data,char ack_type)
{
  unsigned char twi_status;
  char r_val = -1;               

  if (ack_type) {
    // Read I2C Data and Send Acknowledge
    twi_status=i2c_transmit(I2C_DATA_ACK);
    if (twi_status != TW_MR_DATA_ACK) goto i2c_quit;
  } else {
    // Read I2C Data and Send No Acknowledge
    twi_status=i2c_transmit(I2C_DATA);
    if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
  }
  // Get the Data
  *data=TWDR;
  r_val=0;
i2c_quit:
  return r_val;
}

// Convert Decimal to Binary Coded Decimal (BCD)
char dec2bcd(char num)
{
  return ((num/10 * 16) + (num % 10));
}

// Convert Binary Coded Decimal (BCD) to Decimal
char bcd2dec(char num)
{
  return ((num/16 * 10) + (num % 16));
}



void Read_DS1307(void)
{
   char data;
   // First we initial the pointer register to address 0x00
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
    // Start from Address 0x00
   i2c_write(0x00);
   // Stop I2C Transmission
   i2c_stop();

   // Start the I2C Read Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_READ);
   // Read the Second Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[0]=bcd2dec(data & 0x7F);
   // Read the Minute Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[1]=bcd2dec(data);
   // Read the Hour Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   if ((data & 0x40) == 0x40) {
     hour_mode = HOUR_12;
ampm_mode=(data & 0x20) >> 5;   // ampm_mode: 0-AM, 1-PM
ds1307_addr[2]=bcd2dec(data & 0x1F);
   } else {
     hour_mode = HOUR_24;
ampm_mode=0;
     ds1307_addr[2]=bcd2dec(data & 0x3F);
   }
   // Read the Day of Week Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[3]=bcd2dec(data);
   // Read the Day of Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[4]=bcd2dec(data);
   // Read the Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[5]=bcd2dec(data);
   // Read the Year Register, Send Master No Acknowledge
   i2c_read(&data,NACK);
   ds1307_addr[6]=bcd2dec(data);
   // Stop I2C Transmission
   i2c_stop();
}



void Write_DS1307(void)
{
   unsigned char i, hour_format;
   // Make sure we enable the Oscillator control bit CH=0 on Register 0x00
   ds1307_addr[0]=ds1307_addr[0] & 0x7F;
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
   // Start from Address 0x00
   i2c_write(0x00);
   // Write the data to the DS1307 address start at 0x00
   // DS1307 automatically will increase the Address.
   for (i=0; i<7; i++) {
     if (i == 2) {
  hour_format=dec2bcd(ds1307_addr[i]);
  if (hour_mode) {
    hour_format |= (1 << 6);
        if (ampm_mode)
      hour_format |= (1 << 5);
         else
      hour_format &= ~(1 << 5);
  } else {
    hour_format &= ~(1 << 6);
       }
  i2c_write(hour_format);
} else {
       i2c_write(dec2bcd(ds1307_addr[i]));
     }
   }
   // Stop I2C Transmission
   i2c_stop();
}


void port_init(void)
{
  PORTB = 0x00;
  DDRB  = 0x00;

  PORTC = 0x00; //m103 output only
  DDRC  = 0x0f;

  PORTD = 0x00;
  DDRD  = 0x00;
}


unsigned char digit_num=0;
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0};         // Seven segment 4자리 숫자 출력 버퍼
unsigned int FourDigit=1234;

volatile int display_now = 0;


void Display(void){        
display_num[0] = (FourDigit%10000)/1000;
    display_num[1] = (FourDigit%1000)/100;
    display_num[2] = (FourDigit%100)/10;
    display_num[3] = (FourDigit%10);
}



typedef unsigned char BYTE;

volatile BYTE RS_Char=0x00;


int SendByte(BYTE data)
{
// while (!((UCSRA) & (1<<UDRE)));
loop_until_bit_is_set(UCSRA,UDRE);
UDR = data;
return 0;
}


SIGNAL(SIG_UART_RECV) // UART0 수신 인터럽트
{
RS_Char = UDR;
SendByte(RS_Char);
}


SIGNAL(SIG_OVERFLOW0)
{
static unsigned char count = 0;
  TCNT0= 0xFF - 157;          // overflow at 10 mSec

if(count > 10) { // every 100ms
display_now = 1;
count = 0;
return;
}
count++;
}


void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
UCSRA = 0X00;
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
UCSRB = 0X98;
UCSRC = 0X06;
// Setting BaudRate
UBRRH = 0X00;
UBRRL = (F_CPU/BaudRate/16 - 1);

}


int main()
{

asm volatile ("cli"); //disable all interrupts
  port_init();



  TCCR0=(1<<CS02)|(1<<CS00);  // Use maximum prescaller: Clk/1024
// 64us per 1 clk
  TCNT0= 0xFF - 157;          // overflow at 10 mSec
  TIMSK=(1<<TOIE0);            // Enable Counter Overflow Interrupt


UART_Init(9600);


 // Initial ATMega168 TWI/I2C Peripheral
  TWSR = 0x00;   // Select Prescaler of 1
  // SCL frequency = 11059200 / (16 + 2 * 48 * 1) = 98.743 khz
  TWBR = 0x30;   // 48 Decimal


  asm volatile ("sei"); //re-enable interrupts

fdevopen(SendByte, 0);
 
while(1) {
    // Read DS1307
if(display_now) {
display_now = 0;
   Read_DS1307();   
printf("%s,%s(%d:%d:%d)\r\n",weekday[ds1307_addr[3]],month[ds1307_addr[5]],ds1307_addr[2],ds1307_addr[1],ds1307_addr[0]);
}
}
return 1;
}

코딩 중..



// Made by DAEWOO RYU
// NEW TECHNOLOGY COMPANY(N.T.C)
// Email : davdiryu@newtc.co.kr
// http://www.NTC.co.kr
// You can use this source code freely, but we don't support for upgrading or
// we do have no responsiblilty for using this source code for commercial purpose.
// When you spread this source code out, then please leave my name and company name.

// ****************************** //
// *** I2C Hardware Interface *** //
// ****************************** //

#define F_CPU (16000000L)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <compat/twi.h>



#define MAX_TRIES 50
#define DS1307_ID    0xD0        // I2C DS1307 Device Identifier
#define DS1307_ADDR  0x00        // I2C DS1307 Device Address
#define I2C_START 0
#define I2C_DATA 1
#define I2C_DATA_ACK 2
#define I2C_STOP 3
#define ACK 1
#define NACK 0

// DS1307 Register Address
// Second: ds1307_addr[0]
// Minute: ds1307_addr[1]
// Hour  : ds1307_addr[2]
// Day   : ds1307_addr[3]
// Date  : ds1307_addr[4]
// Month : ds1307_addr[5]
// Year  : ds1307_addr[6]

#define HOUR_24 0
#define HOUR_12 1
char ds1307_addr[7];
char sdigit[3]={'0','0','\0'};
char *weekday[]={"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
char *month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char hour_mode, ampm_mode;




/* START I2C Routine */
unsigned char i2c_transmit(unsigned char type) 
{
  switch(type) {
     case I2C_START:    // Send Start Condition
       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
       break;
     case I2C_DATA:     // Send Data with No-Acknowledge
       TWCR = (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_DATA_ACK: // Send Data with Acknowledge
       TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_STOP:     // Send Stop Condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return 0;
  }
  // Wait for TWINT flag set on Register TWCR
  while (!(TWCR & (1 << TWINT)));
  // Return TWI Status Register, mask the prescaller bits (TWPS1,TWPS0)
  return (TWSR & 0xF8);
}
char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type)
{
  unsigned char n = 0;
  unsigned char twi_status;
  char r_val = -1;
i2c_retry:
  if (n++ >= MAX_TRIES) return r_val;
  // Transmit Start Condition
  twi_status=i2c_transmit(I2C_START);

  // Check the TWI Status
  if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
  if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
  // Send slave address (SLA_W)
  TWDR = (dev_id & 0xF0) | (dev_addr & 0x07) | rw_type;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
  if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

void i2c_stop(void)
{
  unsigned char twi_status;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_STOP);
}

char i2c_write(char data)
{
  unsigned char twi_status;
  char r_val = -1;
  // Send the Data to I2C Bus
  TWDR = data;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

char i2c_read(char *data,char ack_type)
{
  unsigned char twi_status;
  char r_val = -1;               

  if (ack_type) {
    // Read I2C Data and Send Acknowledge
    twi_status=i2c_transmit(I2C_DATA_ACK);
    if (twi_status != TW_MR_DATA_ACK) goto i2c_quit;
  } else {
    // Read I2C Data and Send No Acknowledge
    twi_status=i2c_transmit(I2C_DATA);
    if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
  }
  // Get the Data
  *data=TWDR;
  r_val=0;
i2c_quit:
  return r_val;
}

// Convert Decimal to Binary Coded Decimal (BCD)
char dec2bcd(char num)
{
  return ((num/10 * 16) + (num % 10));
}

// Convert Binary Coded Decimal (BCD) to Decimal
char bcd2dec(char num)
{
  return ((num/16 * 10) + (num % 16));
}



void Read_DS1307(void)
{
   char data;
   // First we initial the pointer register to address 0x00
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
    // Start from Address 0x00
   i2c_write(0x00);
   // Stop I2C Transmission
   i2c_stop();

   // Start the I2C Read Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_READ);
   // Read the Second Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[0]=bcd2dec(data & 0x7F);
   // Read the Minute Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[1]=bcd2dec(data);
   // Read the Hour Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   if ((data & 0x40) == 0x40) {
     hour_mode = HOUR_12;
ampm_mode=(data & 0x20) >> 5;   // ampm_mode: 0-AM, 1-PM
ds1307_addr[2]=bcd2dec(data & 0x1F);
   } else {
     hour_mode = HOUR_24;
ampm_mode=0;
     ds1307_addr[2]=bcd2dec(data & 0x3F);
   }
   // Read the Day of Week Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[3]=bcd2dec(data);
   // Read the Day of Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[4]=bcd2dec(data);
   // Read the Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[5]=bcd2dec(data);
   // Read the Year Register, Send Master No Acknowledge
   i2c_read(&data,NACK);
   ds1307_addr[6]=bcd2dec(data);
   // Stop I2C Transmission
   i2c_stop();
}



void Write_DS1307(void)
{
   unsigned char i, hour_format;
   // Make sure we enable the Oscillator control bit CH=0 on Register 0x00
   ds1307_addr[0]=ds1307_addr[0] & 0x7F;
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
   // Start from Address 0x00
   i2c_write(0x00);
   // Write the data to the DS1307 address start at 0x00
   // DS1307 automatically will increase the Address.
   for (i=0; i<7; i++) {
     if (i == 2) {
  hour_format=dec2bcd(ds1307_addr[i]);
  if (hour_mode) {
    hour_format |= (1 << 6);
        if (ampm_mode)
      hour_format |= (1 << 5);
         else
      hour_format &= ~(1 << 5);
  } else {
    hour_format &= ~(1 << 6);
       }
  i2c_write(hour_format);
} else {
       i2c_write(dec2bcd(ds1307_addr[i]));
     }
   }
   // Stop I2C Transmission
   i2c_stop();
}


void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x0f;
 PORTD = 0x00;
 DDRD  = 0x00;
}


unsigned char digit_num=0;
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0};         // Seven segment 4자리 숫자 출력 버퍼
unsigned int FourDigit=1234;

int display_now = 0;

SIGNAL(SIG_OVERFLOW0)
{
    TCNT0 = 0x94; //reload counter value
display_now = 1;
}

void Display(void){        
display_num[0] = (FourDigit%10000)/1000;
    display_num[1] = (FourDigit%1000)/100;
    display_num[2] = (FourDigit%100)/10;
    display_num[3] = (FourDigit%10);
}



typedef unsigned char BYTE;

volatile BYTE RS_Char=0x00;


int SendByte(BYTE data)
{
// while (!((UCSRA) & (1<<UDRE)));
loop_until_bit_is_set(UCSRA,UDRE);
UDR = data;
return 0;
}


SIGNAL(SIG_UART_RECV) // UART0 수신 인터럽트
{
RS_Char = UDR;
SendByte(RS_Char);
}

void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
UCSRA = 0X00;
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
UCSRB = 0X98;
UCSRC = 0X06;
// Setting BaudRate
UBRRH = 0X00;
UBRRL = (F_CPU/BaudRate/16 - 1);

}


int main()
{

asm volatile ("cli"); //disable all interrupts
  port_init();



  TCCR0A=0x00;                  // Normal Timer0 Operation
  TCCR0B=(1<<CS02)|(1<<CS00);   // Use maximum prescaller: Clk/1024
  TCNT0=0x94;                   // Start counter from 0x94, overflow at 10 mSec
  TIMSK=(1<<TOIE0);            // Enable Counter Overflow Interrupt


UART_Init(9600);


 // Initial ATMega168 TWI/I2C Peripheral
  TWSR = 0x00;   // Select Prescaler of 1
  // SCL frequency = 11059200 / (16 + 2 * 48 * 1) = 98.743 khz
  TWBR = 0x30;   // 48 Decimal


  asm volatile ("sei"); //re-enable interrupts

fdevopen(SendByte, 0);
 
while(1) {
    // Read DS1307
if(display_now) {
display_now = 0;
   Read_DS1307();   
printf("%d,%d,%d,%d,%d,%d,%d\r\n",ds1307_addr[0],ds1307_addr[1],ds1307_addr[2],ds1307_addr[3],ds1307_addr[4],ds1307_addr[5],ds1307_addr[6]);
}
}
return 1;
}

알릭스 보드를 지르다..




요즘 대세라는 넷파이.. 자작 대세라는 알릭스.


alix 보드 공식 배포 사이트인 펭귄 뭐시기에 2/29 일에 주문했는데, 어제 오후에야 도착했습니다.


옛날에 쓰던 CF 메모리(샌디스크 2g) 가 있어서, 스타터 키트가 아닌 3D2 만 단품으로 구매했습니다.


그래서 CF 에 VOYAGEMPD 를 직접 탑재해야했습니다.


저에게 이미 CF 카드 리더기가 있는 줄 알았는데 없더군요.


어제밤에 부랴 부랴 구매하고 오늘에서야 컴퓨터에 연결해봤네요.


다행이 제 컴퓨터에는 시리얼포트가 있고, 케이블도 굴러다니는게 하나 있어서 putty 를 통하지 않고 시리얼로 연결해봤습니다.


전원 넣고 "login:" 메세지  나올 때까지 딱 2분 20초 걸리네요.


부팅하는데 시간이 좀 걸린다는 얘기죠


혹시나 알릭스 구매하셔서 시리얼통신 없이 putty 로 바로 확인하시는 분은 마음 느긋하게 가지고 기다리세요///


뭐 워낙 매뉴얼이 잘되어 있어 설치까진 쉽게 했으나..


nas 추가하고 .. 설정하는 부분에서는 안헤멜 수가 없더군요.


특히 공유 폴더 설정해서 넣는게 가장 어려웠습니다만.. 지금은 다 잘됩니다 ㄷㄷ


음원 출력용으로는 전에 만들어 둔 2704 dac를 붙였습니다. 역시나 잘 인식됩니다.






케이스를 정하고 잠깐 시간내서 뒷면만 조각했습니다.


앰프도 넣을까 했는데 일단 간단하게, 알릭스 + cosdac 조합으로 갑니다. 전원 단자는 만들었는데 전원을 뭘 쓸지 고민이네요.


앰프를 안 넣으면 굳이 트로이달 넣을 필요도 없을텐데..흠



부스트 컨버터의 제작.

MC34063 칩을 이용하여 12V 입력을 170V 출력으로 바꿔주는 부스트 컨버터를 제작하였다.

원래 이렇게 많이 튀기는 건 효율상 쓰질 않으나 닉시관이 소모하는 전력이 크지 않아 무시하기로 하였다.

 

NIXIE 소켓용 PCB 제작..

NIXIE 관은 170V 라는 고전압으로 구동하기 때문에, 일반적인 MCU 출력 등으로는 제어할 수 없다.

원래에는 이런 닉시관을 on off 하기에 최적화된 74141 이라는 칩을 사용하던데, 이를 구할 수 없어서,

외부에 TR을 달았다.

내압 350V 짜리 TR 페어인 2N6517, 2N6520 을 사용하였다.
 
이를 보통의 4bit decoder 를 이용하여 제어할 생각이다. 

nixie

#include <SPI.h>

#define    SW1PIN    (3)
#define    SW2PIN    (4)
#define    SW3PIN    (5)

#define    DIGIT1PIN  (6)
#define    DIG2T1PIN  (7)
#define    DIG3T1PIN  (8)
#define    DIG4T1PIN  (9)

#define    DECODE1PIN  (10)
#define    DECODE2PIN  (10)
#define    DECODE3PIN  (10)
#define    DECODE4PIN  (10)

int hour, minute,second;

unsigned long cur_time, last_time;

void setup() 
{
  hour = 0;
  minute = 0;
  second = 0;
  pinMode(SW1PIN,INPUT);
  pinMode(SW2PIN,INPUT);
  pinMode(SW3PIN,INPUT);

  Serial.begin(9600);
  SPI.begin();
 
  last_time = millis() + 1000; 
  delay(100);
}


void loop() 
{
  if(digitalRead(SW1PIN) == LOW) {
    Serial.println("SW1 ..");
  }
  if(digitalRead(SW2PIN) == LOW) {
    Serial.println("SW2 ..");
  }
  if(digitalRead(SW3PIN) == LOW) {
    Serial.println("SW3 ..");
  }
  
  
  
  cur_time = milis();
  if(cur_time < last_time) return;
  last_time = cur_time + 1000;
  
  second = second + 1;
  if(second > 60)  {
    minute = minute + 1;
    second = 0;
    if(minute > 60) {
      hour = hour + 1;
      minute = 0;
    }
  }
}

간단한 imu 테스트.




저번 글에서 소개한 위모션 플러스에서 떼어낸 3축 자이로 센서와

 

A7260 3축 가속도 센서만 이용한 회로입니다.

 

아직 어떤 필터도 결합하지 않았구요.

 

인터넷상에 칼만 필터 자료 돌아다니니 공부해봐야죠.

 

원래엔 가속도 필터에서 기울기를 뺀 후에 적분하여 현재 위치를 얻는데 쓰려고 했는데요.

 

이거 데이타 값 보니까 영 힘들겠더군요.

 

하더라도   atmega128 정도의 스피드로는 어림도 없고 따로  fpga를 달아서 처리를 해야할 모양입니다.

 

다만 fpga 코딩은 좀 까다워서 문제군요. 그리고 제가 가진 fpga인 사이클론은 부피가 크고 무게가 무겁네요.

 

좀 쓸만한 것은 bga타입으로 나오구요.. 흠.

 

아니면 새롭게 dsp 환경을 구축해서 활용해볼까 했는데, 개발 환경 구축하려면 돈이 꽤나 ㄷㄷㄷ

 

어떻게 진행할지 고민좀 해야겟습니다.. 누가 충고좀;;

 

ps. 참고로 윗 3개가 자이로 센서 출력, 밑에 3개가 가속도 센서 출력입니다.

prev 1 ··· 4 5 6 7 8 9 10 ··· 17 next