2013-07-29 5 views
0

다른 사람들과 약간 뒤로 뭔가를 성취하려고합니다. 주어진 센서 데이터의 배열을 그래프로 그려 봅니다. 내 테스트 벤치는 센서의 입력 샤프트를 움직이기 위해 스테퍼 모터를 사용하고 센서의 전압의 ADC 값을 얻고 멈 춥니 다.감열 프린터 용 C/C++에서 비트 맵에 배열을 그립니다.

현재 버전 0.9 벤치는 그래픽 출력이 없습니다. 적절한 최종 해결책이 될 것입니다. 현재 35 개의 데이터 포인트가 있으며 90에서 100을 얻으려고합니다. 결과는 int 어레이에 저장됩니다. 인덱스는 선형이므로 복잡한 플롯은 아니지만 작업자에게 표시하기 위해 플롯을 왼쪽 아래에서 맨 오른쪽으로 개념화하는 데 문제가 있습니다. 나는 TFT 화면에 그림을 그려서 원점을 문자 그대로 번역 한 다음 점을 그리는 선을 그릴 수 있습니다 ...

나쁘고, 이것을 열전 사 프린터로 인쇄하고 싶습니다.이 부분을 번역해야합니다. 384 픽셀 이하의 그래프로 semantics of communicating the image to the printer에 대해 너무 걱정하지 않지만 배열을 이미지로 변환하는 방법.

Arduino Mega에서이 작업을 수행하므로 라이브러리가 그다지 강력하지 않습니다. 최소한 코드에는 많은 RAM이 있습니다. :/

다음은 Arduino 테스트에서 데이터를 가져 와서 Excel에 공급하는 예입니다. 나는 컬러를 찾고 있지는 않지만 그래프를 나타나게하고이 설정을 컴퓨터에 연결하지 마십시오. 또는 네트워크. This is the ESC/POS printer, btw.

plot of sensor data


업데이트

: 나는 답을 알아 낸하지만 커뮤니티와 공유 아직 자신을 대답하지 않았습니다. 만약 당신이 똑같은 것을 배우려고한다면, 저의 프로필에서 저에게 이메일을 보내주십시오. 나는 여기 또는 당신에게 직접 대답 할 것입니다.

답변

0

알고리즘은 세 가지 주요 단계를 거쳤습니다.
1) Y를 왼쪽 상단에서 왼쪽 하단으로 이동합니다.
2) X를 워드 : 비트 값으로 분해합니다.
3) Bresenham의 알고리즘을 사용하여 점 사이에 선을 그립니다. 그리고 make the line thicker하는 방법을 알아낼.

my exact case의 경우 대상 비트 맵은 384x384이므로 메모리에 저장하려면 19k SRAM이 필요합니다. 나는 "절름발이"Arduino 메가 도랑을 가지고 ChipKIT uC32에 RAM 32k, 80 MHz CPU, & I/O를 가져 오도록 업그레이드해야했습니다!

내가 알아 낸 방법은 내 논리를 Arduino의 Adafruit's Thermal library에 두는 것이 었습니다. 예제에는 인쇄를 위해 1 비트 비트 맵을 정적 배열로 변환하는 방법이 포함되어 있습니다. 나는 그들의 GFX 라이브러리를 사용하여 setXY 함수와 GFX Bresenham의 알고리즘을 구현하여 (setXY()을 사용하여 (X, Y) 사이에 선 그리기).

그것은 모두가 내가 쓴이 기능의 코드로 내려 삶은 :

// *bitmap is global or class member pointer to byte array of size 384/8*384 
// bytesPerRow is 384/8 
void setXY(int x, int y) { 
    // integer divide by 8 (/8) because array size is byte or char 
    int xByte = x/8; 
    // modulus 8 (%8) to get the bit to set 
    uint8_t shifty = x%8; 
    // right shift because we start from the LEFT 
    int xVal = 0x80 >> shifty; 
    // inverts Y from bottom to start of array 
    int yRow = yMax - y; 
    // Get the actual byte in the array to manipulate 
    int offset = yRow*bytesPerRow + xByte; 
    // Use logical OR in case there is other data in the bitmap, 
    // such as a frame or a grid 
    *(bitmap+offset)|=xVal; 
} 

큰 점 배열을 기억하는 것입니다, 우리는 행에서 바로가는, 비트 맵의 ​​왼쪽 상단에서 시작된다 , 그리고 나서 하나의 Y 행을 반복하고 반복한다. gotchya's은 X를 "combo"라는 단어로 번역합니다. 당신은 왼쪽에서 (Y를 뒤쪽으로 번역하는 것과 같은) 이동해야합니다. 또 다른 고치야는 Y에 대한 부기에서 일회성 오류입니다.

이 모든 것을 한 클래스에 넣었습니다. 그 덕분에 모든 것을 할 수있는 하나의 큰 기능을 만들지 못하게되었고 더 나은 디자인을 통해 생각보다 구현이 쉬워졌습니다. 인쇄물의

그림 :
Output from TPS test bench I made
Write-up of the project is here.