[CANTUS] W5100을 이용한 네트웍 스피커 제작

 

 

 

CANTUS-EX 보드는 하드웨어 TCP/IP를 지원하는 W5100을 BUS방식으로 제어할 수 있기 때문에 네트웍 속도가 빠르다.

이 저렴한 솔루션을 이용하여 활용할 수 있는 어플리케이션으로 네트웍 스피커를 제작해 보았다.

 

네트웍 스피커는 이더넷으로 연결되는 스피커 이기 때문에 원격지에서 원하는 음원을 송출 가능하며 많은 수의 스피커를 원하는 형태로 제어 가능하다. 인터넷 라디오나 원격방송용으로 활용하면 좋을것 같다.

 

 

 

구성도

전체적인 구성도로 보면 아래와 같다.

 

네트웍은 하드웨어 TCP/IP를 지원하는  W5100을 이용하므로 쉽게 구현할 수 있다. 음원 전송은 UDP, 멀티캐스트 방식으로 원하는 IP의 스피커로 전송가능하다. MCU는 I2S와 소프트웨어 MP3코덱을 지원하는 CANTUS를 이용하여 아주 저렴하게 네트웍으로 받은 음원을 출력할 수 있다.

 

스피커 출력은 15W출력을 가진 소형의 Class-D AMP [TPA-3110 EVM] 보드를 이용했다.

 

 

 

PC 서버 프로그램

PC용 소프트웨어는 네트웍에 연결된 스피커들의 IP를 찾고 원하는 IP에 음원을 전송하거나 제어 명령을 보낼 수 있다. 또한 네트웍 상에서 IP를 변경하거나 LCD에 메세지를 출력할 수 있다.

 

 

 

마무리

테스트용이라 스피커 위에 그냥 고정했다.  

케이스가 있으면 좋겠는데.. 아니면 스피커 속으로 들어가면 더 좋을것도 같고...

추후 아크릴로 판넬하나 만들면 좋을것 같다.

 

 

 

 

 

 

네트웍 스피커 테스트 동영상

TCP/IP 프로그램으로 네트웍상의 스피커를 검색하고 원하는 IP로 보드상의 LED를 제어 하거나  MP3파일 혹은 WAV파을 전송하여 스피커로 출력하는 테스트 동영상이다.

[CANTUS] Timer 테스트 - 타이머 인터럽트를 이용하여 1초 만들기

CANTUS의 Timer는 15bit Pre-scaler를 내장한 32 Bit Timer로 8채널을 가지고 있다.
엄청 많은데... 혹 다른 기능들 하고 겹치진 않겠지? (좀더 알아볼 필요가 있다.) 아무튼 스펙은 좋다.





Timer Interrupt를 사용하기 위해 Interrupt.c의 setinterrupt() 함수를 사용하면 된다.
BOOL setinterrupt(INTNUM_TIMER0, void (*fp)())


Interrupt Service Routine(ISR)이 Vector Table에 Setting되면 Interrupt를 Enable 한다.
void EnableInterrupt(INTNUM_TIMER0, TRUE);




CANTUS 타이머 제어 레지스터
Lib사용할 경우 아래 함수로 쉽게 설정 가능하다.
BOOL settimer(int nCh,U32 ms);






CANTUS Timer 테스트 예제코드

#include "system.h"
#include "serial.h"


volatile unsigned int gTimerTick1_1ms = 0;


//----------------------------------------------------------------------------
//Timer Interrupt Handler
void Timer0ISR(void)
{

 gTimerTick1_1ms++;

}
//----------------------------------------------------------------------------


int main()
{
 int flag = 0;
 
 SystemInit();

 Led1Init();
 Led1On();

 U0_Init(BAUD_115200);
 DebugPrint("adStar EVM - Timer Test\r\n");



 //Timer  초기화

 InitInterrupt();

 setinterrupt(INTNUM_TIMER0,Timer0ISR);

 settimer(0,1);


 while(1)
 {
  if( gTimerTick1_1ms>1000)
  {
   gTimerTick1_1ms = 0;
    
   flag ^= 1;
   if(flag)Led1On();
   else Led1Off();
  }
 }
 
 return 0;
}



TAG CANTUS, timer
[CANTUS-EX] 이더넷을 이용한 움직이는 이미지파일 전송 테스트


[CANTUS-EX] 보드는 저렴한 고속 이더넷 솔루션으로 제작한 보드이다. AVR가격 보다 저렴하지만 고속의 메모리제어 방식을 적용하면 고속 이더넷이 가능하다.

초기 기능 테스트를 위해 이더넷으로 GIF이미지를 전송하여 LCD에 출력하는 테스트를 진행 해 보았다.
아직 외부 메모리 부분의 속도를 고속으로 하기는 무리가 있지만, 이더넷으로 이미지 전송하는 기본 테스트는 가능하기 때문에 간단한 테스트를 해 보았다.


CANTUS 이더넷을 이용항 이미지 전송 테스트 동영상
[CANTUS-EX] 보드가 TCP서버로 동작하며 Client에서 움직이는 GIF이미지를 설정하면 이미지를 받아와 TFT-LCD에 출력하는 테스트 이다.


[CANTUS-EX EVM] TFT LCD테스트 - 메모리 모드 제어


CANTUS 는 저렴한 국산 32bit MCU지만 성능이 나쁘지 않다.
메모리 제어  방식이 가능하므로 TFT LCD제어를 GPIO방식이 아니라 메모리 제어 방식으로 해 보았다.


[CANTUS-EX EVM] 보드에서 TFT LCD의 Enable 핀은 CS1( P2.5)에 할당 되어 있다.

속도 측정 결과 400x240 한프레임 출력 하는데 걸리는 시간은 16ms 정도  된다. 포트제어 방식에 비교하면 좀더 빨라진것 같다.


SRAM CS0의 메모리 설정을 위해 SxCTRL(0x80000404)  레지스터를 이용하여 설정할 수 있다.





CANTUS 512 TFT LCD 메모리 제어 방식 테스트 동영상
한프레임 출력시 4ms걸리는 TMS320028335 와 ([TMS32F28335 TFT LCD_속도측정 결과) 비교하면 좀 느린감이 있지만 SD Card를 제어에 있어 SDIO기능이 있기 때문에 더 빨라 보인다. 결론적으로 성능이나 가격 보다는 각 특정 기능에 적합한 MCU를 선정할 필요가 있는것 같다.







CANTUS TFT LCD 메모리 제어 방식 설정

void LcdMode(void)
{
 *(volatile U16*)0x80000404 = 0x0101;//BANK 1 16Bit
 
 *R_PAF0 = 0xAAAA; //SRAM interface address, data
 *R_PAF1 = 0xaaaa;
 *R_PAF2 = 0xAAAA; /* nCS, nWE, nRE, ALE */ 
 }



TFT LCD제어 코드
포트제어 방식과 비교하면 상당히 코드가 간단해 진다. 때문에 속도도 더 빨라진다.
void Lcd_Cmd(unsigned int Data)   //Write Command
{
//LCD_RS_OFF();
 *(volatile unsigned short*)(LCD_BASE_DATA_ADDR) = Data;
// LCD_RS_ON();
}

void Lcd_Data(unsigned int Data)  //Write Data
{
 
 *(volatile unsigned short*)(LCD_BASE_DATA_ADDR) = Data;
 }
[CANTUS EX EVM]  W5100 외부 메모리로 제어하기 - W5100 Direct Mode TCP전송 속도



[CANTUS-EX EVM] 보드의 W5200 CS는 nCS2(6008_0000h)에 할당되어 있다.




일단 간단히 W5100 제어 레지스터에 값을 읽고 쓰는 테스를 해 보자
 #define COMMON_BASE                              0x60080000
#define SHAR0                                                 (COMMON_BASE + 0x0009)


while(1)
{
        //W5100 MAC 레지스터에 값 쓰기
        *((vuint8*)(COMMON_BASE+SHAR0 )) = data;
        Delay(500);

        //MAC 레즈스터값 읽기
        temp =  *((vuint8*)(COMMON_BASE+SHAR0 ));
        DebugPrint("read=%x\r\n", tenp);
       Delay(500);
}



정상 동작한다.

W5100 TCP Server 루프백 테스트 예제를 포팅하여 테스트 해 보았다.

의외로 속도가 그리 빠르지 않다.
옵티마이즈나? 메모리 타이밍 설정이 필요 할것 같다.
[7] iInChip Send: 4.8839 Mbps(1193338 bytes, 1.8642 sec)
iInChip Recv: 4.0566 Mbps(1193338 bytes, 2.2443 sec)
------------------------------------------------------------
[8] iInChip Send: 4.3536 Mbps(1193338 bytes, 2.0913 sec)
iInChip Recv: 4.0821 Mbps(1193338 bytes, 2.2303 sec)
--------------------------------------------------------




한가지 문제가 발생했다.
데이터 전송을 잘 되는데... 수신이 문제가 있는것 같다.(송신이 이상한가?)
루프백 테스트시 read에서 invaild가 발생한다.

물론 한번에 100000Byte 이상 보내는것은 문제가 없이 송수신된다.

PC 소프트웨어 문제이가?
하드웨어적 이상인가?

패킷 캡쳐해본 결과 데이터 자체는 문제가 없는것 같다. 송수신 데이터는 같은데...
소프트웨어 문제 인가?

10kbye정도의 작은 데이터 전소 성공후 또 잘 된다.
메모리 엑세스 타이밍 조절으로 최대 6.2Mbps까지 출력은 되는데...
기대하던 속도는 아니다.(이정도면 SPI 방식보다 그리 빠르지 않은데... 뭔가 좀 이상하다.)




옵티마이즈와 메모리 엑세스 타이밍을 적절히 조절 후 최종 7MBps이상 나온다.
한가지 의심스러운것은 direct모드와 indirect 모드에서 속도차이가 별로 나지 않는다는 것인데... 그렇다면 어쩌면 속도는 더 나올지도 모르겠다.

[1] iInChip Send: 7.4276 Mbps(11983617 bytes, 12.3092 sec)
iInChip Recv: 7.4303 Mbps(11983617 bytes, 12.3048 sec)
------------------------------------------------------------

[CANTUS-EX EVM] 보드 제작

[MCU]/CANTUS | 2011.10.25 17:28
Posted by nexp
[CANTUS-EX EVM] 보드 제작


국산 32비트 MCU CANTUS 를 테스트 할 수 있는  보드를 제작했다. 기존의 M-Type [CANTUS EVM] 보드 는 범용으로 제작되었기 때문에 CANTUS의 기능을 모두 적용하려면 확장 보드가 필요한데... 고민하다 CANTUS의 특징을 활용할 수 있는 보드를 제작해 보기로 했다.

기본적인  CANTUS기능을 테스트 할 수 있도록 SDIO, ADC, DAC, Voice Codec을 테스트 할 수 있도록  했고, 기존에 제작 해 두었던 이더넷, TFT LCD모듈, WiFi 모듈 등을 연결 할 수 있다.





이더넷 모듈
CANTUS는 저렴하면서도 외부 메모리 확장이 가능하므로 하드웨어 TCP/IP모듈인 W5100을 적용하면 고속으로 이더넷 전송이 가능하다. 이를 위해 메모리 제어 방식으로 W5100을 연결할 수 있도록 했다.





TFT-LCD
역시 고속의 메모리제어 방식으로 TFT-LCD모듈을 연결하여 좀더 고속으로 LCD제어를 할 수 있도록 했다.




CANTUS-EX 보드를 이용하면 이더넷으로 이미지를 전송하여 LCD에 표시하거나 오디오 파일을 전송하여 출력하는 인터넷 라디오 기능을 저렴한 가격으로 구현할 수 있을것 같다.

테스트 동영상

네트웍을 이용한 영상 전송 테스트이다.

 

네트웍을 이용한 음성 전송 테스트

[CANTUS EVM] W5200을 이용한 TCP/IP 전송 속도 테스트


CANTUS는 데이터 버스가 있기 때문에 궂이 SPI을 통해 제어할 필요는 없지만 SPI속도가 23Mhz라 테스트 해 볼만하다.
[NET-EVM] 보드를 이용하녀  SPI만 지원하는 W5200 모듈의 TCP 전송속도를  테스트 해 보았다.

SPI 최대 클럭이 23Mhz 일때 전송 속도는 2.38Mbps가 출력 된다.





W5200 드라이버 코드
//-----------------------------------------------------------------------------
// W5100 HAL
#define W5100_CS_PORT     
#define W5100_CS_BIT     BIT5
#define W5100_RST_BIT     BIT4

#define W5100_IO_INIT()     Sbi(*R_PAF4, (3<<(2*5)));Sbi(*R_P4oDIR, W5100_CS_BIT);\
          Sbi(*R_PAF2, (3<<(2*4)));Sbi(*R_P2oDIR, W5100_RST_BIT)

#define IINCHIP_CSoff()     Sbi(*R_P4oLOW, W5100_CS_BIT)
#define IINCHIP_CSon()     Sbi(*R_P4oHIGH, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI0_Init()
#define IINCHIP_SpiSendData    SPI0_WriteReadByte
#define IINCHIP_SpiRecvData    SPI0_WriteReadByte

#define IINCHIP_RSToff()    Sbi(*R_P2oLOW, W5100_RST_BIT)
#define IINCHIP_RSTon()     Sbi(*R_P2oHIGH, W5100_RST_BIT)
//-----------------------------------------------------------------------------

[CANTUS EVM] WiFi 모듈 테스트 - 무선랜을 이용한 DAQ (24bit ADC) 테스트


Serial to WiFi Module (WIZ6100wi)을 이용하여 무선 데이터 수집 장치를 만들어 보았다.
무선랜을 간편하게 사용할 수 있는 WiFi모듈을 이용하면 고속의 데이터를 인터넷으로 손쉽게 수집할 수 있다.

MCU는 저렴하고 RAM이 풍부한 ADChip사의 CANTUS를 이용하고 USB2Serial 커넥터에 WiFi모듈을 연결 하였다.


데이터 수집은 SPI인터페이스의 24비트 ADC모듈을 이용하고 펑션으로 사인파를 입력 하여 테스트 했다.



무선랜 접속
WIZ610은 AP기능이 있어 PC에서 클라이언트 형태로 접속 가능하다. 자세한 환경 설정은 . [WiFi to Serial 모듈 설정]  부분을 참고 한다.

WiFi모듈의 기본 IP는 192.168.1.254 로 접속해서 TCP/IP통신을 하면 MCU쪽에서는 시리얼 형태로 데이터를 수신 할 수 있다. 최대 전소 속도는 1Mbps까지 가능하다.


PC프로그램 작성
무선랜 모듈에 접속하기 위해 TCP/IP프로그램을 작성하면 되는데... 여러 형태로 작성 가능하지만 우선 간단하고 UI 를 쉽게 작성할 수 있는 C#을 이용하였다.


테스트를 위해 간단히 CANTUS EVM의 LED를 On/Off하고 수집한 24bit ADC값을 그래프로 표시하도록 했다.



펌웨어 작성
MCU(CANTUS EVM)쪽 펌웨어는 WiFi모듈을 시리얼로 인식하기 때문에 간단하게 작성할 수 있다.
시리얼 포트로 특정 커멘드를 받으면 동작하도록  처리한다.

  if(U0_IsGetByte())
  {
   switch(U0_GetByte())
   {
    case '2':
     DebugPrint("Led1 Off\r\n");
     Led1Off();
     break;

    case '3':
     DebugPrint("Led1 On\r\n");     
     Led1On();
    break;
    
    case '4':
     DebugPrint("Led2 Off\r\n");
     Led2Off();
     break;

    case '5':
     DebugPrint("Led2 On\r\n");
     Led2On();
    break;
        
    case '6':
     //ADC값 전송 시작
     adc_send_flag ^= 1;
    break; 


ADC값은 타이머 인터럽트를 이용하여 시리얼 포트로 보내면 WiFi로 전송이 된다. 아주 간단하게 WiFi 통신이 가능하다.
  if(adc_send_flag)
  {
   //ADC값 전송
   if(gTimeTick1_1ms>10)
   {
    DebugPrint("ADC=%d\r\n", GetAdc24(0));
    gTimeTick1_1ms = 0;
   }
  }


CANTUS WiFi 테스트 동영상
WiFi를 이용하여 네트웍으로 LED제어하고 24bit ADC데이터 수집 테스트

[CANTUS] DAC 테스트

[MCU]/CANTUS | 2011.07.22 18:37
Posted by nexp
[CANTUS] DAC 테스트

CANTUS에는 14-bit Sigma-Delta Voice Codec 이 내장 되어 있다. 간단한 WAV파일 출력이나 DAC로 사용하면 유용하게 쓰일곳이 많을것 같다.

CODEC 특징을 살펴 보면
- 14-bit Sigma-Delta A/D with 75dB SNR
- 14-bit Sigma-Delta D/A with 80dB SNR
- Digital Input/Output 2‟s Complement Format
- Sampling Frequency Max. 11.025KHz
- Record Gain supported using Pre-Amplifier with External Resisters
- A/D, D/A Converter Individual Power On/Off
- D/A Converter Analog Output Mute Function


TAG CANTUS
[CANTUS EVM] USB HID테스트 - USB로 센서 데이터 그래프에 표시


CANTUS는 저렴한 MCU임에 불구하고 USB기능이 있어 여러모로 사용할곳이 많은것 같다.
USB를 이용하여 3축 가속도 센서 데이터를 그래프로 표시하는 테스를 해 보았다. 기존 STM32를 이용하여 센서데이터를 USB로 전송하는 예제가 있어 쉽게 포팅할 수 있었다.

HID를 이용하면 드라이버필요 없이 USB에 연결할 수 있어 간단히 USB전송하기 좋다.

ADChip사에서 제공하는 USB API를 이용하면 아주 간단히  USB를 제어 할 수 있다. 깔끔하게 잘 동작한다.
하지만 라이브러이 형태이기 때문에 수정이나 다른 프로젝트에 계속 추가 하기가 쉽지 않아 사용자 처리 부분은 빼내서 처리했다.

그리고 한가지더.. 엔드포인트 수가 적고, 특히 64Byte 엔드포인트는 2개밖에 없다.



USB초기화 부분
 //USB초기화
 //-------------------------------------------
 setinterrupt(INTNUM_USB,usb_irq_f);
 EnableInterrupt(INTNUM_USB,TRUE);
 
 //USB Enable
 Sbi(*R_PAF5, (3<<(2*7)));
    Sbi(*R_P5oDIR, BIT7);
    Sbi(*R_P5oLOW, BIT7);
    Delay(100);
 
 usb_set_description(USB_Configuration_Descriptor,USB_Device_Descriptor,HID_ReportDescriptor,USB_StringDescriptor);
    usb_init();
 //-------------------------------------------



가속도 센서 데이터 수집 및 USB전송 코드
 while(1)
 {
  GetAccelValue(AXIS_X, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[0] = data;
  gUsbTxBuffer[1] = data>>8;
  
  GetAccelValue(AXIS_Y, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[2] = data;
  gUsbTxBuffer[3] = data>>8;
  
  GetAccelValue(AXIS_Z, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[4] = data;
  gUsbTxBuffer[5] = data>>8; 
  
  //USB로 센서 데이터 전송
  SendtoUsb(gUsbTxBuffer, sizeof(gUsbTxBuffer));
  
  Delay(4);
 }


CANTUS USB전송 테스트 동영상
USB HID로 3축 가속도 센서데이터를 전송하고 그래프로 표시하는 예제

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)