DE0 SoCめも fat32フォルダの中身
焼いたファイル
atlas_sdcard_v1.1.img.tgz
qwtを使ってみる
aitendo液晶でも結構きれいにグラフが書ける。

ここを参考にした。
http://wildpie.hatenablog.com/entry/20110129/1296292970
インストールの仕方は本家にあるように
svn checkout svn://svn.code.sf.net/p/qwt/code/branches/qwt-6.1
svnがなければsubversionを先にインストールする必要がある。
sudo apt-get install subversion
その後はqtのコンパイルと一緒
qmake
make
sudo make install
これで /usr/local/qwt-6.1.3-svn/ にインストールされる。
ライブラリは /usr/local/qwt-6.1.3-svn/lib にあるんだけど
勝手に見に行ってくれないので指定する必要がある。
sudo nano /etc/ld.so.conf
の最後に
/usr/local/qwt-6.1.3-svn/lib
を追加する。
有効にするには
sudo ldconfig
を実行する。
QtCreatorにはライブラリが勝手には入らないようだ。
qwtというプロジェクトを作ったら
qwt.proの最後に以下を追加する
LIBS += -L/usr/local/qwt-6.1.3-svn/lib -lqwt
INCLUDEPATH += /usr/local/qwt-6.1.3-svn/include
先に自作クラスを作っておいた方がいい。
plot.h
#define PLOT_H
#include <qwt_plot.h>
class QwtPlotCurve;
class Plot : public QwtPlot
{
Q_OBJECT
public:
explicit Plot(QWidget *parent = 0);
void plotCurve();
private:
QwtPlotCurve *sin_crv;
signals:
public slots:
};
#endif // PLOT_H
plot.c
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <qwt_plot_grid.h>
Plot::Plot(QWidget *parent) :QwtPlot(parent)
{
setCanvasBackground(QColor(Qt::white)); // 背景白
insertLegend(new QwtLegend(), QwtPlot::BottomLegend); // 凡例
// グリッド
QwtPlotGrid *grid1 = new QwtPlotGrid;
grid1->enableXMin(true);
grid1->setMajorPen(QPen(Qt::black, 0, Qt::DashDotLine));
grid1->setMinorPen(QPen(Qt::gray, 0, Qt::DotLine));
grid1->attach(this);
// 曲線の設定
sin_crv = new QwtPlotCurve("sin");
sin_crv->setPen(QPen(Qt::red));
sin_crv->attach(this);
// 曲線の描画
plotCurve();
}
void Plot::plotCurve()
{
const int kArraySize = 1000;
double x[kArraySize] = {}; // x
double y_sin[kArraySize] = {}; // y
for (int i = 0; i < kArraySize; ++i) {
x[i] = i / (kArraySize - 1.0);
y_sin[i] = sin(2.0*M_PI*(x[i]));
}
sin_crv->setSamples(x, y_sin, kArraySize);
}
ここではPlotクラスを作っている。
promoteの仕方はQtCreatorの右上で

Promoted class nameとHeader fileに入力してAddすると
上の選択肢にPlotが増える。
Plotクラスを選択してPromoteボタンを押す。
これでグラフが表示されるようになる。
sysfsのスピード
色んな所で/dev/memを使ったライブラリが公開されている。
こじ研のraspGPIOとか。
http://www.myu.ac.jp/~xkozima/lab/raspTutorial3.html
/dev/memを使うとsudoは必須になるようだ。
sudoはいいんだけど、sudoでqtのアプリを起動するとx windowが表示されない。
xを起動してるのが一般ユーザでsudoのアプリがsuだからだろう。
かと言ってxごとsudoで起動すると危なそうなので、
sudoを必要としない方法を探してる。
やっぱり/sys/class/gpioが確実なんだろう。
どのくらいの速度が出るかやってみた。
GPIOのベンチマークはこのサイトでやられている。
http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/
/dev/memは22MHz
/sys/class/gpioシェルスクリプトは2.8KHzだそうだ。
なるべく早く動くようにつくりたい。
openは一回だけでいいみたい。1をwriteするとすぐにONになるようだ。
なのでこんなコードでON/OFFできる。
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
int fd,i;
fd = open("/sys/class/gpio/gpio21/value", O_WRONLY);
if(fd < 0)
{
perror("file open error\n");
return fd;
}
for(i=0;i<10000;i++)
{
write(fd, "1" , 1 );
write(fd, "0" , 1 );
}
close(fd);
return 0;
}
Lチカ
何本か端子が余る。GPIOとして使ってみる。
Raspiのピンヘッダに
ピンヘッダ用接続ケーブル
をつけてブレッドボードにつなげる。
ソケット側がちょっと長くてちょっと浮くけど気にしない。
GPIO - LED - 抵抗1K - GND
と簡単な回路をブレッドボードで作る。
色んな所に書かれてる方法を試してみる。
echo 21 > /sys/class/gpio/export
これで/sys/class/gpio/gpio21フォルダができる
echo out > /sys/class/gpio/gpio21/direction
これで出力設定になった
echo 1 > /sys/class/gpio/gpio21/value
これでLEDが点灯した。
色んな所に書かれている情報ではsudoが必要とあるんだけど、
いまのOSのバージョンだとsudoは不要みたい。
これをqtで制御してみる。
directionまでは最初に設定すればいいみたい。
アプリからはvalueの部分だけやればいい。
qtでQPushButtonを4つ追加して配置する。
objectNameはsw1,sw2,sw3,sw4とした。
checkableのチェックを入れた。

ON/OFFをもてるSWになる。
このSWではSLOTはGo to SLOTでtoggled(bool)を指定すると
ON/OFFが変わった時に呼ばれる関数ができる。
引数にON/OFFが入っているので
それによってさっきのコマンドを実行するようにプログラムを書く。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_sw1_toggled(bool checked)
{
if(checked)
system("echo 1 > /sys/class/gpio/gpio12/value");
else
system("echo 0 > /sys/class/gpio/gpio12/value");
}
void MainWindow::on_sw2_toggled(bool checked)
{
if(checked)
system("echo 1 > /sys/class/gpio/gpio16/value");
else
system("echo 0 > /sys/class/gpio/gpio16/value");
}
void MainWindow::on_sw3_toggled(bool checked)
{
if(checked)
system("echo 1 > /sys/class/gpio/gpio20/value");
else
system("echo 0 > /sys/class/gpio/gpio20/value");
}
void MainWindow::on_sw4_toggled(bool checked)
{
if(checked)
system("echo 1 > /sys/class/gpio/gpio21/value");
else
system("echo 0 > /sys/class/gpio/gpio21/value");
}
これで液晶のボタンを押すとLEDがつくようになった。








